在Jupyter中使用Trino/Hive聚合表时json_format函数报错如何解决?
问题
在Jupyter Notebook中使用Trino和Hive执行聚合表的SQL时遇到错误,SQL代码如下:
q = f""" CREATE TABLE {aggregated_table} AS WITH aggregated_data AS ( SELECT id, date, -- Aggregate counts into JSON strings json_format( map_agg(column_A, COUNT(column_A)) ) AS column_A_counts, AVG(column_B) AS column_B_avg, FIRST_VALUE(column_C) OVER (PARTITION BY id, date) AS column_C FROM {disaggregated_table} GROUP BY id, date ) SELECT * FROM aggregated_data """ %sql $q
运行后报错:
TrinoUserError(type=USER_ERROR, name=FUNCTION_NOT_FOUND, message="line ...: Unexpected parameters (map(varchar(5),bigint)) for function json_format. Expected: json_format(json)")
解决方法
错误根源是json_format仅接受JSON类型参数,但map_agg(column_A, COUNT(column_A))返回的是MAP类型,类型不匹配导致报错。可以通过以下两种方式修复:
方式1:将MAP转为JSON后传入json_format
用CAST函数把MAP类型转换为JSON类型,再传入json_format:
json_format( CAST(map_agg(column_A, COUNT(column_A)) AS JSON) ) AS column_A_counts
方式2:直接使用to_json函数(Trino原生支持)
Trino的to_json函数可直接将MAP序列化为JSON字符串,无需额外转换步骤:
to_json(map_agg(column_A, COUNT(column_A))) AS column_A_counts
额外提示:当前SQL中FIRST_VALUE(column_C)的窗口分区键和分组键完全一致,若同一id, date分组内column_C值唯一,可直接用MAX(column_C)或MIN(column_C)替代窗口函数,避免聚合函数与窗口函数混用的潜在问题。
内容的提问来源于stack exchange,提问作者qwerty
相关产品推荐
相关产品推荐

