You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 11:37:07