Redshift COPY csv 数组字段以分隔行
Redshift COPY csv array field to separate rows
我有一个相对较大的 Mongo 数据库集合,我正在将其迁移到 Redshift。这是大约 600 毫米的文档,所以我希望副本尽可能高效。
问题是,我的 Mongo 集合中有一个数组字段,但我想将数组中的每个值插入到 Redshift 中的单独行中。
Mongo:
{
id: 123,
names: ["market", "fashion", "food"]
}
在 Redshift 中,我想要 "id" 和 "names" 的列,其中主键是 (id, name)。所以我应该从那个 mongo 文档中得到 3 个新的 Redshift 行。
是否可以使用 Redshift COPY 命令来做到这一点?我可以将我的数据作为 csv 或 json 导出到 s3,但由于处理那么多文档需要多长时间,我不想对数据进行任何额外处理。
您或许可以使用触发器在 COPY 上执行此操作,但这会很尴尬并且性能会很差(因为您不能只转换行并且需要从触发器函数执行 INSERT)。
不过,这是一个微不足道的转换,为什么不在导出时通过任何脚本语言传递它呢?
您也可以按原样导入,然后进行转换(在 Redshift 上应该很快):
CREATE TABLE mydata_load (
id int4,
names text[]
);
复制
CREATE TABLE mydata AS SELECT id, unnest(names) as name FROM mydata_load;
Redshift 不像 PostgreSQL 那样支持数组,因此您不能按原样插入数据。
但是,MongoDB 有一个简单的聚合函数,允许您 unwind arrays exactly as you want - by using the other columns as the keys. So I'd export the result of that into a JSON, and then store it into Redshift using JSONPaths。
我有一个相对较大的 Mongo 数据库集合,我正在将其迁移到 Redshift。这是大约 600 毫米的文档,所以我希望副本尽可能高效。 问题是,我的 Mongo 集合中有一个数组字段,但我想将数组中的每个值插入到 Redshift 中的单独行中。
Mongo:
{
id: 123,
names: ["market", "fashion", "food"]
}
在 Redshift 中,我想要 "id" 和 "names" 的列,其中主键是 (id, name)。所以我应该从那个 mongo 文档中得到 3 个新的 Redshift 行。
是否可以使用 Redshift COPY 命令来做到这一点?我可以将我的数据作为 csv 或 json 导出到 s3,但由于处理那么多文档需要多长时间,我不想对数据进行任何额外处理。
您或许可以使用触发器在 COPY 上执行此操作,但这会很尴尬并且性能会很差(因为您不能只转换行并且需要从触发器函数执行 INSERT)。
不过,这是一个微不足道的转换,为什么不在导出时通过任何脚本语言传递它呢?
您也可以按原样导入,然后进行转换(在 Redshift 上应该很快):
CREATE TABLE mydata_load (
id int4,
names text[]
);
复制
CREATE TABLE mydata AS SELECT id, unnest(names) as name FROM mydata_load;
Redshift 不像 PostgreSQL 那样支持数组,因此您不能按原样插入数据。
但是,MongoDB 有一个简单的聚合函数,允许您 unwind arrays exactly as you want - by using the other columns as the keys. So I'd export the result of that into a JSON, and then store it into Redshift using JSONPaths。