将具有多个布局的json对象从S3复制到Redshift

时间:2014-05-23 17:52:01

标签: json amazon-s3 amazon-redshift

我有一个S3存储桶,其中包含许多包含“\ n”分隔的json对象的文件。这些json对象可以有几个不同的布局。所有布局都有一组标准的标准键。大多数差异只是有一些额外的键,但有些具有嵌套的json对象。一个文件可以包含任何/所有这些布局。

我已经设法在Redshift中定义一个基本表,并将数据复制到该表中,但是我表中没有的任何键都会丢失。

我想为每个布局创建一个表,并将json对象复制到相应的表中。具有嵌套json对象的布局可能可以作为json保留在单个字符串列中,因为Redshift能够在查询中解析json。

我是AWS的新手,所以任何帮助都将不胜感激。此外,随意建议可能也可以使用的非Redshift服务。

谢谢!

2 个答案:

答案 0 :(得分:1)

您需要为要加载的每个表运行单独的COPY。但是,您可能遇到嵌套对象的问题(截至目前)。

我们放弃了直接JSON加载,因为它无法加载任意数量的嵌套对象。每个嵌套对象都必须通过它的索引(例如,#nest; 0 [0]')来引用它以加载它。当可能有数千个物体时,这是不理想的。

答案 1 :(得分:0)

您无法通过“复制”命令跳过行。 您可以想到的一个选项假设文件正在加载到S3。您可以拆分文件并将其放入不同的文件夹中。因此,您可以运行不同的复制命令将数据加载到不同的表。 其他选项: 您可以只将第一级json对象加载到临时表,并可以使用Redshift JSON函数。 示例: JSON 1:

{
    "a": "value",
    "b": "value",
    "c": "value",
    "d": "value",
    "f": {
        "fa": "value",
        "fb": "value",
        "fc": "value",
        "fd": "value"
    },
    "g": "value"
}

JSON 2:

{
    "a": "value",
    "b": "value",
    "c": "value",
    "d": "value",
    "e": {
        "ea": "value",
        "eb": "value",
        "ec": {
            "eca": "",
            "ecb": "value",
            "ecc": "value",
            "ecd": "value",
        }
    },
    "f": {
        "fa": "value"
    },
    "g": "value"
}

在JSON 2中,' e'标签是额外的。您可以将这两种不同类型的JSON加载到同一个表中,然后使用Redshift JSON函数进一步处理。

您的目标表应包含以下列:

a, b, c, d, e, f, g

您的jsonpath应如下所示:

{
    "jsonpaths": ["$.a", "$.b", "$.c", "$.d", "$.e", "$.f", "$.g"]
}

加载JSON 1时,列e加载为null。

我希望这就是你要找的东西。如果您找到了解决方案,请告诉我。