如何调整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,提问作者גיל גליקשטרן
相关产品推荐
相关产品推荐

