【问题标题】:Redshift COPY csv array field to separate rowsRedshift COPY csv 数组字段以分隔行
【发布时间】:2016-03-09 15:17:36
【问题描述】:

我有一个相对较大的 MongoDB 集合,正在迁移到 Redshift。这是约 600 毫米的文档,所以我希望副本尽可能高效。 问题是,我的 Mongo 集合中有一个数组字段,但我想将数组中的每个值插入到 Redshift 中的单独行中。

蒙哥:

{
  id: 123,
  names: ["market", "fashion", "food"]
}

在 Redshift 中,我想要“id”和“names”列,其中主键是 (id, name)。所以我应该从那个 mongo 文档中获得 3 个新的 Redshift 行。

是否可以使用 Redshift COPY 命令来做到这一点?我可以将我的数据以 csv 或 json 格式导出到 s3 中,但由于处理这么多文档需要多长时间,我不想对数据进行任何额外的处理。

【问题讨论】:

    标签: postgresql amazon-redshift


    【解决方案1】:

    您可能可以使用触发器在 COPY 上执行此操作,但这会很尴尬并且性能会很差(因为您不能只转换行并且需要从触发器函数执行 INSERT)。

    不过,这是一个微不足道的转换,为什么不在导出时通过任何脚本语言传递它?

    您也可以按原样导入,然后进行转换(在 Redshift 上应该很快):

    CREATE TABLE mydata_load (
      id    int4,
      names text[]
    );
    

    复制

    CREATE TABLE mydata AS SELECT id, unnest(names) as name FROM mydata_load;
    

    【讨论】:

    • 我认为第二个建议最适合我的用例,我想避免在导出过程中进行转换,但第二个听起来就像我需要的那样工作。谢谢!
    【解决方案2】:

    Redshift 不像 PostgreSQL 那样支持数组,所以你不能直接插入数据。

    然而,MongoDB 有一个简单的聚合函数,它允许您完全按照自己的意愿来unwind 数组 - 通过使用其他列作为键。所以我会将结果导出为 JSON,然后使用 JSONPaths 将其存储到 Redshift。

    【讨论】:

      猜你喜欢
      • 2014-03-18
      • 2019-05-15
      • 2016-06-15
      • 1970-01-01
      • 2019-12-01
      • 2017-07-31
      • 2018-12-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多