使用JSONPaths将不同的JSON结构从S3复制到Redshift

时间:2018-06-25 13:45:00

标签: amazon-s3 amazon-redshift jsonpath

我正在尝试将一些数据从S3复制到Redshift,这些数据已从MySQL数据库流式传输。问题是我获取的JSON文件位于两种结构之一(新行和更新行)中,即

[
   {
       "table": "user",
       "row": {
           "values": {
               "attribute1": "",
               "attribute2": "",
               "attribute3": ""
           }
       },
       "type": "WriteRowsEvent",
       "schema": "public"
   },
   {
       "table": "user",
       "row": {
           "before_values": {
               "attribute1": "",
               "attribute2": "",
               "attribute3": ""
           },
           "after_values": {
               "attribute1": "",
               "attribute2": "",
               "attribute3": ""
           }
       },
       "type": "UpdateRowsEvent",
       "schema": "public"
   }
]

当数据为“类型”:“ WriteRowsEvent”时,我想获取所有列。当数据为“类型”:“ UpdateRowsEvent”时,我希望除“ before_values”中的列之外的所有列。

我希望可以在JSONPaths文件中执行一些简单的OR逻辑,但是Redshift似乎不支持此逻辑:

{
    "jsonpaths": [
       "$.table",
       "$.row.(values|after_values).attribute1",
       "$.row.(values|after_values).attribute2",
       "$.row.(values|after_values).attribute3",
       "$.type",
       "$.schema"
    ]
}

docs

  

Amazon Redshift不支持任何JSONPath元素,例如   通配符或过滤器表达式,它们可能会解析为   路径不明确或多个名称元素。结果,Amazon Redshift   无法解析复杂的多层数据结构

还有其他方法可以实现这一目标吗?注意:不幸的是,使用json as 'auto' COPY选项无效。

更新:目前看来,我唯一的选择是将这些数据复制到具有额外列的临时表中,然后使用该表对最终表进行必要的插入/更新,即< / p>

{
    "jsonpaths": [
       "$.table",
       "$.row.values.attribute1",
       "$.row.values.attribute2",
       "$.row.values.attribute3",
       "$.row.after_values.attribute1",
       "$.row.after_values.attribute2",
       "$.row.after_values.attribute3",
       "$.type",
       "$.schema"
    ]
}

0 个答案:

没有答案