【问题标题】:Copy JSON with multiple values from S3 to Redshift将具有多个值的 JSON 从 S3 复制到 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

有什么想法吗?

【问题讨论】:

    标签: json amazon-web-services amazon-s3 copy amazon-redshift


    【解决方案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。

    【讨论】:

      猜你喜欢
      • 2014-07-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多