将具有多个值的 JSON 从 S3 复制到 Redshift
Posted
技术标签:
【中文标题】将具有多个值的 JSON 从 S3 复制到 Redshift【英文标题】:Copy JSON with multiple values from S3 to Redshift 【发布时间】:2017-08-14 07:09:56 【问题描述】:我正在尝试使用复制命令将其中一列中具有多个值的 JSON 文件加载到 Redshift,但出现错误:
无效的 JSONPath 格式:成员不是对象。
这就是我的 JSON 文件的样子:
"id":3,
"name":"John",
"children":[
"child":"Ann","age":10,
"child":"Dan","age":4,
"child":"Ben","age":3]
这是我的 jsonpath 文件:
"jsonpaths": [
"$.id",
"$.name",
"$.children.child",
"$.children.age"
]
我希望 SQL 中的数据能够显示:
id name child age
-- ---- ----- ---
3 John Ann 10
3 John Dan 4
3 John Ben 3
有什么想法吗?
【问题讨论】:
【参考方案1】:COPY 中的 JSONPaths 只会在输入文件中的每个条目(或行)中创建一行。在上面的示例中,您希望从一个条目创建 3 行,而 Redshift 不支持。
您可以考虑对数据进行预处理以将其转换为以下内容:
"id":3,
"name":"John",
"child":"Ann",
"age":10
,
"id":3,
"name":"John",
"child":"Dan",
"age":4
,
"id":3,
"name":"John",
"child":"Ben",
"age":3
然后,以下简单的 JSONPath 将起作用:
"jsonpaths": [
"$.id",
"$.name",
"$.child",
"$.age"
]
【讨论】:
感谢您的回复。我们的问题是我们正在尝试通过 S3 将 BSON 集合从 MongoDB 加载到 Redshift,我们正在努力这样做。由于 mongo dump 只创建(嵌套的)BSON 文件,我们尝试将其转换为 JSON,因此我们得到了这些括号。您是否知道使用复制命令不使用 ETL 工具将 BSON 文件从 S3 加载到 Redshift 的最佳实践? 最好就此提出另一个问题。作为一个快速的答案,我会尝试编写一个 bash/python 脚本来做到这一点。【参考方案2】:如果您无法更改源文件的结构,请尝试将其加载到 PIVOT 表中,每个值有一列(前提是值的数量固定)。在复制过程后在 Redshift 中执行 UNPIVOT。
【讨论】:
以上是关于将具有多个值的 JSON 从 S3 复制到 Redshift的主要内容,如果未能解决你的问题,请参考以下文章
将 csv 和 json 数据从 S3 复制到 Redshift
从AWS Lambda python函数将多个JSON文件合并到S3中的单个JSON文件