将具有多个值的 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文件

使用复制命令将数据从 s3 加载到 redshift

如何解析具有多个值的 json?

从具有不同值的逗号分隔 JSON 对象填充 html 下拉列表

Jquery从具有数组/ JSON值的多个数据属性中检索数据