我正在尝试将一些数据从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"
]
}