Redshift COPY命令加载超长JSON至SUPER列报错解决方案咨询
解决方案:Redshift COPY加载超长JSON到SUPER列报错问题
问题根源
你遇到的错误是因为S3中的properties字段是被引号包裹的JSON字符串,而非原生JSON对象。COPY命令的JSON 'auto'参数会将这种带引号的内容识别为VARCHAR类型,而Redshift的VARCHAR最大长度限制为65535字节,超长时触发报错。而INSERT + JSON_PARSE是主动将字符串解析为SUPER对象,SUPER类型无此长度限制,因此可以成功插入。
可行解决方案
方案1:修改S3源JSON格式(推荐)
将S3中JSON数据的properties字段从字符串格式改为原生JSON对象,去掉外层引号:
// 修改前(带引号的字符串) { "id": 123, "properties": "{\"Is Active\":true,\"Tags\":[\"TAG1\"....]}" } // 修改后(原生JSON对象) { "id": 123, "properties": {"Is Active":true,"Tags":["TAG1"....]} }
修改后直接使用原COPY命令即可,JSON 'auto'会自动将原生JSON对象解析为SUPER类型,不再触发长度限制。
方案2:通过临时表中转加载
如果无法修改S3源数据,可通过临时表中转:
- 创建带CLOB类型列的临时表(CLOB支持最大1GB存储,可容纳超长字符串):
CREATE TEMP TABLE temp_my_table ( id INT, properties CLOB );
- 用COPY命令将数据加载到临时表:
COPY temp_my_table ("id","properties") FROM 's3://.....' CREDENTIALS 'aws_access_key_id=...;aws_secret_access_key=...' region 'us-east-1' ACCEPTANYDATE ACCEPTINVCHARS AS '~' ENCODING UTF8 ROUNDEC DATEFORMAT AS 'auto' TIMEFORMAT 'auto' COMPUPDATE OFF STATUPDATE OFF TRUNCATECOLUMNS BLANKSASNULL EMPTYASNULL TRIMBLANKS JSON 'auto' GZIP ;
- 用
JSON_PARSE将临时表数据转存到目标表:
INSERT INTO my_table ("id", "properties") SELECT id, JSON_PARSE(properties) FROM temp_my_table;
方案3:使用COPY的列映射函数(进阶)
Redshift COPY支持在列映射中直接使用函数,可指定properties列通过JSON_PARSE解析:
COPY my_table ("id", "properties" JSON_PARSE) FROM 's3://.....' CREDENTIALS 'aws_access_key_id=...;aws_secret_access_key=...' region 'us-east-1' ACCEPTANYDATE ACCEPTINVCHARS AS '~' ENCODING UTF8 ROUNDEC DATEFORMAT AS 'auto' TIMEFORMAT 'auto' COMPUPDATE OFF STATUPDATE OFF TRUNCATECOLUMNS BLANKSASNULL EMPTYASNULL TRIMBLANKS JSON 'auto' GZIP ;
注意:此方式需要确保COPY命令能正确读取到properties的字符串值,若仍存在类型识别问题,优先使用方案2。
内容的提问来源于stack exchange,提问作者ijonas
相关产品推荐
相关产品推荐

