首页 > 解决方案 > 如何使用 jsonpaths 从 s3 复制到 redshift,同时将某些列默认为 null

问题描述

我已经在 redshift 中定义了一个包含某些列的现有表。这已经使用 jsonpaths 定义和 COPY FROM JSON 命令从一个 S3 存储桶成功映射到。这一切都很好。

但是我现在有不同格式的数据,这些数据存储在不同的 S3 存储桶中,并且还希望将这些数据放入 Redshift 中的 SAME 表中。但是,这个新数据并没有这个 redshift 表中所有列的值——我想简单地将 redshift 表中的某些值默认为 none 用于新的存储桶数据。我的问题是我不知道如何最好地设置新 S3 存储桶的 jsonpaths 定义以使用,以便我也可以轻松地在新的 s3 存储桶上运行 COPY FROM JSON。

我试图避免对新的存储桶数据进行预处理,这可能只涉及添加具有空值的附加键(以映射到不需要的列)。

我尝试简单地将空字符串放入 jsonpaths 以与红移中的列对齐,我不关心将值放入其中。但是,AWS redshift 文档指出空字符串会导致在 COPY FROM JSON 命令期间出现错误。 https://docs.aws.amazon.com/redshift/latest/dg/copy-parameters-data-format.html#copy-json-jsonpaths

现有红移表

CREATE TABLE events (
    platform_name VARCHAR(10),
    app_id VARCHAR(10),
    app_version VARCHAR(10)
)

现有存储桶的现有映射文件

{
    "jsonpaths": [
       "$['device']['platform']['name']",
       "$['application']['app_id']",
       "$['application']['version_code']"
    ]
}

新存储桶的映射文件,其中数据对象仅具有对应于name和不对应于的值app_idnor app_version。但我想把它们放到同一个红移表中。

{
    "jsonpaths": [
       "$['platform']",
       ???,
       ???
    ]
}

是否有一种选择只是在我知道肯定不会以新格式存在的 JSON 路径中的位置?会显得奇怪...

标签: amazon-s3amazon-redshift

解决方案


解决此问题的最佳方法是在表定义中定义默认值。

CREATE TABLE events (
    platform_name VARCHAR(10),
    app_id VARCHAR(10) default 'null',
    app_version VARCHAR(10) default 'null'
)

仅保留地图文件中数据集中可用的字段

{
    "jsonpaths": [
       "$['platform']"
    ]
}

然后在调用 COPY 命令时选择列

COPY events ("platform")
FROM 's3 file location'
json 'map file location'

希望这可以帮助。


推荐阅读