从S3加载含JSON字符串的CSV文件到Redshift失败问题求助
问题根因
- 字段长度不足触发错位:你定义的
action_values字段为varchar(256),但示例中的JSON字符串长度已经超过500字符,加载时内容被截断,截断后剩余的内容被识别为新的字段,导致整行的字段边界完全错位,原本对应前6列的位置都被后续的JSON片段填充。 - 报错中
Type: Long的来源:你表中第四列account_id为int8类型,Redshift中int8对应Long类型,字段错位后,该位置被以[开头的JSON片段填充,非数字内容无法转换为Long类型,因此抛出你看到的报错。
解决方案
全程无需转换为JSON文件输入,基于现有CSV调整即可:
- 调整表结构,扩大
action_values字段长度
执行DDL修改字段类型,确保能容纳完整的JSON串:
ALTER TABLE table_name ALTER COLUMN action_values TYPE varchar(max);
如果能预估JSON最大长度,也可以指定为varchar(2048)等合适的长度,varchar(max)最大支持65535字符,足够绝大多数场景使用。
- 调整COPY命令参数,优化CSV解析规则
修改后的COPY命令增加ESCAPE参数处理转义字符,避免JSON内容中的特殊字符干扰字段分割:
copy table_name from 's3://bucket_name/subdirectory/filename.csv' delimiter ',' ignoreheader 1 csv quote as '"' ESCAPE dateformat 'auto' timeformat 'auto' access_key_id '...' secret_access_key '...';
- (可选)预处理CSV内容(如果仍有解析问题)
如果调整后还是报错,可以先预处理CSV文件:
- 将JSON内容中的单引号替换为双引号,既符合标准JSON规范,也能避免和CSV解析规则冲突
- 确保所有JSON字段都被双引号完整包裹,JSON内部如果出现双引号,用两个双引号转义(符合CSV标准要求)
快速验证方法
如果还想进一步定位问题,可以先创建一个临时表,所有字段都设为varchar(max)类型,尝试加载数据。如果加载成功,说明原问题就是字段长度不足或类型不匹配导致的错位,再逐一校验字段内容调整即可。
内容的提问来源于stack exchange,提问作者Dan Aizenberg
相关产品推荐
相关产品推荐

