将S3中gzip压缩JSON文件加载至Redshift时遇格式错误问题求助
解决Redshift COPY命令加载S3 Gzip JSON文件的错误
你遇到的错误核心有两个原因,我逐个拆解并给出解决办法:
1. JSON参数的写法错误
你命令里写的json 'AUTO'是大写格式,Redshift仅识别小写的'auto'作为自动匹配的关键字。大写的'AUTO'会被Redshift误认为是一个S3路径,因此抛出了"S3 path格式无效"的错误。
2. S3文件的JSON格式不符合解析要求
你的文件里把两个独立的JSON对象放在了同一行,用空格分隔:
{"a": "a", "b": "a", "time": "20210210T10:10:00"} {"a": "b", "b": "b", "time": "20210210T11:10:00"}
这种格式Redshift无法正确解析,你需要改成以下两种标准格式之一:
- 推荐:JSON Lines格式:每行单独存放一个JSON对象,示例:
{"a": "a", "b": "a", "time": "20210210T10:10:00"} {"a": "b", "b": "b", "time": "20210210T11:10:00"} - JSON数组格式:把所有JSON对象包裹在一个数组中,示例:
[{"a": "a", "b": "a", "time": "20210210T10:10:00"}, {"a": "b", "b": "b", "time": "20210210T11:10:00"}]
修正后的COPY命令
将参数改为小写的'auto',同时确保文件格式正确,最终命令如下:
COPY stTest FROM 's3://bucket/file.gz' credentials 'aws_access_key_id=x;aws_secret_access_key=y' json 'auto' gzip ACCEPTINVCHARS ' ' TRUNCATECOLUMNS TRIMBLANKS;
如果你的JSON字段名和表列名大小写不一致(比如JSON里是Time而表列是time),可以把json 'auto'换成json 'ignorecase',这样就能忽略大小写匹配字段与列。
内容的提问来源于stack exchange,提问作者Nir
相关产品推荐
相关产品推荐

