如何将JSON中的单对象数组通过Redshift COPY命令导入
解决Redshift COPY导入JSON数组只取第一行的问题
你遇到的问题根源在于JsonPath配置里指定了数组索引[0],这只会匹配数组的第一个元素,所以只能导入第一行数据。同时,错误提示“Member is not an object”是因为当JsonPath没有正确指向数组内的对象元素时,Redshift无法解析非对象类型的内容。
正确的JsonPath配置
针对你的JSON数组结构(每个元素是包含a和b的对象),你需要使用不带索引的JsonPath来遍历整个数组的所有元素:
{ "jsonpaths": [ "$.a", "$.b" ] }
这个配置会告诉Redshift:遍历JSON数组中的每一个对象,分别提取每个对象的a和b字段,作为表的一行数据。
完整的COPY命令示例
假设你的目标表已经创建(包含a和b两个字段),可以用以下COPY命令导入数据:
COPY your_target_table (a, b) FROM 's3://your-s3-bucket/path/to/your/data.json' IAM_ROLE 'arn:aws:iam::your-account-id:role/your-redshift-access-role' FORMAT AS JSON 's3://your-s3-bucket/path/to/your/jsonpaths.json';
额外说明
- 如果你的JSON数据是每行一个对象的JSON Lines格式(而非单个大数组),其实可以不用JsonPath,直接使用
FORMAT AS JSON 'auto',Redshift会自动匹配字段。 - 确保S3路径和IAM角色权限正确,Redshift需要能访问到源数据文件和JsonPath文件。
- 检查源JSON的语法是否正确,比如数组的括号、对象的逗号分隔是否规范,语法错误也会导致解析失败。
内容的提问来源于stack exchange,提问作者WackStr
相关产品推荐
相关产品推荐

