我有一个S3存储桶,其中包含许多包含“\ n”分隔的json对象的文件。这些json对象可以有几个不同的布局。所有布局都有一组标准的标准键。大多数差异只是有一些额外的键,但有些具有嵌套的json对象。一个文件可以包含任何/所有这些布局。
我已经设法在Redshift中定义一个基本表,并将数据复制到该表中,但是我表中没有的任何键都会丢失。
我想为每个布局创建一个表,并将json对象复制到相应的表中。具有嵌套json对象的布局可能可以作为json保留在单个字符串列中,因为Redshift能够在查询中解析json。
我是AWS的新手,所以任何帮助都将不胜感激。此外,随意建议可能也可以使用的非Redshift服务。
谢谢!
答案 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。
我希望这就是你要找的东西。如果您找到了解决方案,请告诉我。