Redshift COPY csv 数组字段以分隔行

Posted

技术标签:

【中文标题】Redshift COPY csv 数组字段以分隔行【英文标题】:Redshift COPY csv array field to separate rows 【发布时间】: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 中,但由于处理这么多文档需要多长时间,我不想对数据进行任何额外的处理。

【问题讨论】:

【参考方案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。

【讨论】:

以上是关于Redshift COPY csv 数组字段以分隔行的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Copy commd 中使用反斜杠字符将 s3 csv gz 文件加载到 Redshift

来自 S3 的 AWS Redshift COPY csv

1214:使用 COPY 命令将数据从 csv 导入 Redshift 时 CSV 的报价格式无效

Redshift 中的 COPY CSV 命令是不是按标题中定义的顺序加载?

由于我的 csv 文件中的某些数据中存在“\”,Redshift Copy 命令失败

在 Redshift COPY 中合并文件名