如何使用jsonpaths从s3复制到redshift,同时将某些列默认设置为空

时间:2019-05-22 19:14:14

标签: amazon-s3 amazon-redshift

我已经在redshift中定义了具有某些列的现有表。已经使用jsonpaths定义和COPY FROM JSON命令从一个S3存储桶成功将此映射到了。一切正常。

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

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

我已经尝试过简单地将空字符串放在jsonpaths中,以与redshift中的列对齐,而我并不关心将for放在其中。但是,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_idapp_version的值。但我想将它们放入相同的redshift表中。

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

是否可以选择仅将JSON路径中的某些位置(我肯定知道)以新格式放置在那里?看起来很奇怪...

2 个答案:

答案 0 :(得分:1)

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

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'

希望这会有所帮助。

答案 1 :(得分:0)

让我们采取另一种方法。

按原样保留events表,创建新表events2

CREATE TABLE events2 (
platform_name VARCHAR(10)
)

events2表加载

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

创建如下所示的视图以查看所有事件数据

CREATE VIEW all_events AS
  SELECT platform_name, app_id, app_version
    FROM events
  UNION ALL
  SELECT platform_name, '', '' 
    FROM events2

这更像是一种解决方法,但是只要可行,为什么不行。 这对您来说是可行的解决方案吗?