将CSV加载到Redshift中,注入其他信息

时间:2017-03-28 21:36:19

标签: amazon-redshift

我有一些exported_data.csv,我有一些相应的Redshift表,我有一个COPY

COPY(
  c1,
  c2,
  c3,
  ...
) from "s3://bucket/exported_data.csv"

我想要做的是在表中添加一列source_file,并使用COPY语句(或其他一些语句)中定义的任意信息填充它;在此示例中,该行来自的文件的名称。

我无法使用UPDATE,因为我正在与多少数据进行交互(只需要很长时间)。

看起来我不能使用DEFAULT,因为我需要能够在源文件名称不同时更改信息,但Redshift不允许您更改默认值一栏。 (否则,我只是更改列的默认值,执行复制,更改默认值,从下一个CSV文件执行复制...)

我正在探索“临时表”,但我想在这里问我是否有人在我探索时有一个现成的答案。

2 个答案:

答案 0 :(得分:1)

这是不可能的。但我可以建议你2个解决方法。

预处理:在将数据推送到redshift之前,您必须添加带有数据的额外列,这对您的业务案例来说似乎是一个难以解决的问题。

后处理:临时表是执行此操作的最佳方式。将数据推送到redshift staging表 - 处理数据 - 然后进入redshift final table。
注意 - 随着数据的增长,在红移上运行更新会变得很昂贵,尽可能地避免使用,否则你最终会使用大量的红移处理资源进行真正的假设。

如果希望在单个COPY命令中添加的所有行具有相同的source_file值,则可以将数据复制到临时表中,然后将source_file列添加到该表中,然后将临时表中的所有数据插入到最终表中,如:

CREATE TABLE destination_staging (LIKE destination);
ALTER TABLE destination_staging DROP COLUMN source_file ;
COPY destination_staging FROM 's3://data/destination/(...)' (...)
ALTER TABLE destination_staging ADD COLUM source_file VARCHAR(99);
INSERT INTO destination SELECT * FROM destination_staging;
DROP TABLE destination_staging;


如果我做了一个错误的假设,请发表评论,我将重新调整我的答案。

答案 1 :(得分:0)

我建议也使用临时表。

Redshift不允许在复制语句中添加列。因此,您需要将csv文件原样复制到临时表,然后使用附加列从那里插入到最终表中。