同时在 AWS Redshift 中“CREATE TABLE LIKE”并更改一些列的默认值

Simultaneously `CREATE TABLE LIKE` in AWS Redshift and change a few of columns' default values

工作流程

  1. 在数据导入工作流程中,我们正在使用 CREATE TABLE LIKE statement 创建暂存 table。
CREATE TABLE abc_staging (LIKE abc INCLUDING DEFAULTS);
  1. 然后,我们运行COPY将CSV数据从S3导入stagingtable.

  2. CSV 中的数据不完整。即,CSV 文件中缺少 partition_0partition_1partition_2 字段;我们这样填写:

UPDATE
  abc_staging
SET
  partition_0 = 'BUZINGA',
  partition_1 = '2018',
  partition_2 = '07';

问题

这个查询看起来很昂贵(通常需要大约 20 分钟),我想避免它。如果我可以在创建 abc_staging table 时在这些列上配置 DEFAULT 值,那是可能的。我没有找到任何方法来做到这一点;也没有任何不可能的明确指示。所以也许这仍然是可能的,但我不知道该怎么做?

我考虑过的替代解决方案

删除这些列并重新添加它们

这很容易做到,但是 ALTER TABLE ADD COLUMN only adds columns to the end of the column list. In abc table, they are not at the end of the column list, which means the schemas of abc and abc_staging will mismatch. That breaks ALTER TABLE APPEND 我用来将数据从分段 table 移动到主 table.

的操作

注意。 重新排序 abc 中的列 table 以减轻这个困难 will require recreating 巨大的 abc table 我想避免。

使用适当的列以编程方式生成暂存 table 创建脚本并删除 CREATE TABLE LIKE

如果找不到更好的解决方案,我将不得不这样做。

填写原始 CSV 文件中的 partition_* 个字段

这是可能的,但会破坏向后兼容性(我可能已经有数十万个文件)。更难但易于管理。

正如您所发现的那样,您并未创建 table 与原始版本完全相同的内容,而且 Redshift 不允许您更改列的默认值。您建议的路径可能是最好的(明确定义分段 table)。

由于我不知道你的具体情况,其他路径可能更好,所以我稍微探索一下。首先,当您更新暂存 table 时,您实际上正在读取 table 中的每一行,使该行无效,并在 [=21= 的末尾写入一个新行(包含新信息) ].这会导致大量无效行。现在,当您执行 ALTER TABLE APPEND 时,所有这些无效行都将添加到您的主 table。除非您事先对暂存 table 进行吸尘。所以你可能无法从 ALTER TABLE APPEND.

中得到你想要的值

您最好使用 ORDER BY 子句将数据插入主 table。这比 ALTER TABLE APPEND 语句慢,但您不必执行 UPDATE,因此整个过程可能会更快。由于减少了对 VACUUM 的需求,您可能会走得更远。您的情况将决定这是否更好。只是您列表的另一个选项。

我很好奇你的更新速度。这只需要读取然后写入暂存中的每一行 table。除非暂存 table 非常大,否则这似乎不需要 20 分钟。其他 activity 可能造成这种放缓。只是好奇。

另一种选择是更改主 table 以将这 3 列放在最后(是的,这会有些工作)。通过这种方式,您可以将列添加到暂存 table 中,并且事情会为 ALTER TABLE APPEND 排队。只是另一种可能性。

最简单的解决方案是向源 CSV 文件添加必要的 partition_* 字段。

在采用该更改并从导入程序管道中删除 UPDATE 后,性能得到了极大改善。现在每个导入总共需要 ≈10 分钟(包括 COPYDELETE 重复项和 ALTER TABLE APPEND)。

磁盘 space 不再攀升至 100%。

感谢大家的帮助!