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

Presto中JSON_EXTRACT提取数组所有元素报错求助

在Presto中提取JSON数组字段并生成数组列的解决方案

Presto的JSON_EXTRACT不支持[*]这种通配符式的JSON路径语法,这是导致你报错的核心原因。要实现提取数组中所有amount和category并生成数组列的需求,可以通过JSON类型转换+数组变换函数完成,具体方案如下:

正确SQL语句

SELECT
    JSON_EXTRACT_SCALAR(raw_data, '$.label') AS label,
    TRANSFORM(
        CAST(JSON_EXTRACT(raw_data, '$.lines') AS ARRAY<JSON>),
        line -> JSON_EXTRACT_SCALAR(line, '$.amount')::DOUBLE
    ) AS amount,
    TRANSFORM(
        CAST(JSON_EXTRACT(raw_data, '$.lines') AS ARRAY<JSON>),
        line -> JSON_EXTRACT_SCALAR(line, '$.category')
    ) AS category
FROM your_table;

代码说明

  1. 提取label字段:使用JSON_EXTRACT_SCALAR直接获取字符串类型的label值,相比JSON_EXTRACT会返回不带引号的纯净字符串,更符合需求。
  2. 处理lines数组:
    • 先通过CAST(JSON_EXTRACT(raw_data, '$.lines') AS ARRAY<JSON>)将JSON格式的数组转换为Presto原生数组类型,每个元素为独立的JSON对象。
    • 再用TRANSFORM函数遍历数组中的每个JSON对象,提取对应字段:
      • 针对amount,提取后通过::DOUBLE转换为数值类型(可根据实际数据调整为BIGINT等)。
      • 针对category,直接提取字符串即可。

结果验证

执行上述SQL后,会得到完全符合你期望的结果:

  • label列值:XXX
  • amount列值:[1000.0, 100.0, 10.0](若转换为BIGINT则显示为[1000, 100, 10])
  • category列值:['A', 'B', 'C']

内容的提问来源于stack exchange,提问作者deepAgrawal

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 14:09:26