使用Redshift Spectrum解析JSON数组为行列报错,求解决方法
解决Redshift Spectrum解析JSON数组的报错问题
原因分析
你遇到的报错是因为Redshift Spectrum不支持在嵌套查询(比如CTE)中执行JSON_PARSE结合json_serialize的复杂表达式,Spectrum的查询引擎对这类嵌套JSON操作的支持有限。
可行方案
方案1:导入到Redshift临时表后处理
把Spectrum中的数据先拉到Redshift本地临时表,利用Redshift本地引擎的JSON函数支持来解析展开数组:
-- 创建临时表,将Spectrum数据同步到Redshift本地 CREATE TEMP TABLE emp_local_temp AS SELECT empid, properties_textarray FROM datalake.temp_table; -- 在本地解析并展开JSON数组 SELECT empid, d FROM emp_local_temp, JSON_PARSE(json_serialize(properties_textarray)) AS d;
方案2:调整SQL结构,将复杂操作移到Redshift本地层
避免让Spectrum处理JSON解析逻辑,只让Spectrum返回原始数据,在Redshift本地完成解析和展开:
SELECT raw_data.empid, array_item FROM ( -- 仅从Spectrum获取原始数据,不做任何JSON处理 SELECT empid, properties_textarray FROM datalake.temp_table ) raw_data, -- 在Redshift本地解析JSON数组并展开 JSON_PARSE(json_serialize(raw_data.properties_textarray)) AS array_item;
总结
如果数据量不大,方案2可以快速调整SQL解决问题;如果数据量较大,方案1的临时表方式性能更稳定,因为Redshift本地处理JSON操作的效率比Spectrum更高。
内容的提问来源于stack exchange,提问作者Jeff A
相关产品推荐
相关产品推荐

