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

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源数据,可通过临时表中转:

  1. 创建带CLOB类型列的临时表(CLOB支持最大1GB存储,可容纳超长字符串):
CREATE TEMP TABLE temp_my_table (
  id INT,
  properties CLOB
);
  1. 用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
;
  1. 用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 07:52:44