将 CSV 加载到 Redshift 中,注入更多信息

Posted

技术标签:

【中文标题】将 CSV 加载到 Redshift 中,注入更多信息【英文标题】:Load CSV into Redshift, injecting additional information 【发布时间】:2017-03-28 21:36:19 【问题描述】:

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

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

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

我无法使用UPDATE,因为我正在与之交互的数据量很大(花费的时间太长了)。

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

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

【问题讨论】:

我建议也使用临时表。 Redshift 不允许在复制语句中添加列。因此,您需要将 csv 文件原样复制到临时表中,然后从那里插入带有附加列的最终表。 @JonEkiz - 你是对的。您应该将此作为答案发布。 【参考方案1】:

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

预处理:在将数据推送到 redshift 之前,您必须添加带有数据的额外列,这对于您的业务案例来说听起来是一个困难的解决方案。后处理: 暂存表是执行此操作的最佳方式。将您的数据推送到 redshift 临时表 - 处理数据 - 然后推送到 redshift 最终表。 注意 - 随着数据的增长,在 redshift 上运行更新会变得很昂贵,请尽量避免使用,否则您最终会清理大量使用大量 redshift 处理资源的内容。 如果您希望在单个 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;

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

【讨论】:

【参考方案2】:

我建议也使用临时表。

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

【讨论】:

谢谢!两个问题:a)你能提供一些示例代码吗? b) 你知道这种方法是否比update ... where ... 更有效吗?

以上是关于将 CSV 加载到 Redshift 中,注入更多信息的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Python 从 OS Windows 将 CSV 文件加载到 Amazon Redshift? [关闭]

将 CSV 加载到 Redshift,缺少换行符:在位置 38 发现意外字符 0x76

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

将数据加载到 Redshift

redshift 添加转义字符

使用 Redshift 的 Ignoreheader CSV 文件