从S3导入CSV数据至Redshift时SUPER数据类型解析异常问题
问题原因
- 你当前使用CSV格式直接加载时,Redshift默认会将CSV中存储为字符串的JSON内容直接以字符串形式存入SUPER类型列,不会自动解析为嵌套结构,因此无法直接查询内部字段。
- 你提供的初始建表语句存在语法疏漏:列定义之间缺少逗号分隔,实际执行会报错,需先修正。
解决方案
1. 修正建表语句
CREATE TABLE test ( id smallint, type varchar(10), detail super ) diststyle auto;
2. 修改COPY语句,增加JSON_PARSE参数
指定需要解析为SUPER嵌套结构的列名,Redshift会自动将对应列的JSON字符串解析为SUPER类型的嵌套对象:
copy stage.test from 's3://.../test.csv' region 'us-east-1' iam_role 'arn:aws:iam::xxxxxxx:role/redshift-role' ignoreheader 1 format CSV JSON_PARSE 'detail' ;
如果有多个列需要解析为SUPER,可传入列名数组:JSON_PARSE '["detail", "col2", "col3"]'
验证方法
加载完成后直接查询嵌套字段即可验证是否解析成功:
SELECT detail.type.limits.account FROM test WHERE id = 1;
正常返回值为10即说明解析正确。
注意事项
- 源CSV中的JSON字符串必须符合标准JSON格式,不能存在多余逗号、未转义的双引号等语法问题,否则会触发COPY报错。
- 若已完成数据加载不想重新跑COPY,也可通过UPDATE语句批量转换已存入的字符串格式内容:
UPDATE test SET detail = JSON_PARSE(detail::varchar);
该方案仅适合小批量数据使用,大数据量场景建议直接修改COPY参数重新加载性能更高。
内容的提问来源于stack exchange,提问作者Dan Pham
相关产品推荐
相关产品推荐

