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

如何调整DuckDB查询使JSON数组正常加载至Snowflake?

问题描述

原始JSON数据:

{
 "age": 34,
 "names": ["david", "john"]
}

使用以下DuckDB查询生成Parquet文件:

select i ->> '$.age'      AS age,
       (i ->> '$.names')::JSON AS names,
FROM ( SELECT UNNEST((info ->> '$.Data'):: JSON []) AS i, Id, DATE FROM my_json_report);

但将生成的Parquet文件加载到Snowflake后,names列被识别为包含JSON字符串的数组,格式如下:

[
  "[\"david\",\"john\"]"
]

已尝试以下函数均未解决问题:

ARRAY(SELECT jsonb_array_elements_text((l -> '$.names')::jsonb)) AS names,

json_extract_array(l, '$.names') AS names,

json_extract(l, '$.names') AS names,

regexp_split_to_array(trim(BOTH '[]' FROM json_extract(l, '$.names')::TEXT), ',') AS names.

需要修改DuckDB查询,使names列在Snowflake中呈现为常规数组。

解决方案

问题根源在于i ->> '$.names'会将JSON数组转换为字符串,后续再转为JSON类型时,DuckDB会把该字符串当作JSON的字符串值存储,而非原生数组。正确做法是直接提取原生JSON数组,避免先转字符串。

修改后的DuckDB查询(两种写法均可):

写法一:使用箭头运算符直接提取数组

select 
    i ->> '$.age' AS age,
    i -> '$.names' AS names
FROM ( 
    SELECT UNNEST((info ->> '$.Data')::JSON[]) AS i, Id, DATE 
    FROM my_json_report
);

写法二:使用json_extract函数提取

select 
    json_extract_string(i, '$.age') AS age,
    json_extract(i, '$.names') AS names
FROM ( 
    SELECT UNNEST((info ->> '$.Data')::JSON[]) AS i, Id, DATE 
    FROM my_json_report
);

说明

  • i -> '$.names'或json_extract(i, '$.names')会直接保留原生JSON数组类型,Parquet文件将存储数组而非字符串化的数组,Snowflake加载时就能识别为常规数组。

内容的提问来源于stack exchange,提问作者גיל גליקשטרן

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 19:01:15