Redshift COPY csv数组字段用于分隔行

时间:2016-03-09 15:17:36

标签: postgresql amazon-redshift

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

蒙戈:

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

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

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

2 个答案:

答案 0 :(得分:0)

你可以在带有触发器的COPY上做到这一点,但它很尴尬并且性能会很糟糕(因为你不能只转换行并且需要从触发函数做INSERT) )。

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

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

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

复制

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

答案 1 :(得分:0)

Redshift不像PostgreSQL那样支持Arrays,所以你不能只按原样插入数据。

但是,MongoDB有一个简单的聚合函数,它允许你完全按照你想要的unwind数组 - 通过使用其他列作为键。因此,我将其结果导出为JSON,然后使用JSONPaths将其存储到Redshift中。