【问题标题】:Daily incremental copying from Amazon S3 data into Amazon Redshift每天将 Amazon S3 数据增量复制到 Amazon Redshift
【发布时间】:2021-08-16 20:10:30
【问题描述】:

我有一个 RDS 数据库,它每天拍摄快照并保存在 S3 存储桶中。我每天将 RDS 快照数据从 S3 复制到 Amazon Redshift 数据库。我可以使用copy 来复制表格,但我不想复制整个表格,我只想复制自上次拍摄快照以来添加的行(增量复制)。

例如,在 RDS 中,有一个表名“user”,在 25-05-2021 时看起来像这样

id | username
1  | john
2  | cathy

当我在 2021 年 5 月 26 日第一次运行数据加载器时,它会将这两行复制到同名的 Redshift 表中。

现在 26-05-2021,RDS 中的表格如下所示:

id | username
1  | john
2  | cathy
3  | ola
4  | mike

当我将在 27-05-2021 运行数据加载器时,我不想复制所有三行,而是只想复制/获取新添加的行 (id = 3 and id = 4),因为我已经有了其他行.

进行这种增量加载的最佳方式应该是什么?

【问题讨论】:

  • 在我考虑答案之前先问一个简单的问题:VACUUM 你在做什么?
  • @MaxGanzII,你的意思是如果我用真空吸尘器 RDS 该怎么办?如果是,那不会改变 Redshift 中的任何内容,因为我对仓库有不同的 TTL 策略。
  • 不,我指的是 Redshift 中的真空。您正在将记录加载到表中。除非您采取了特殊步骤,否则它们是未排序的。您需要对它们进行排序(或者使用 Redshift 毫无意义)。排序与加载密切相关,部分原因是集群上一次只能运行一个真空。要回答有关加载的问题,您还必须讨论真空。

标签: python-3.x amazon-web-services amazon-s3 pyspark amazon-redshift


【解决方案1】:

COPY 命令将始终加载整个表。但是,您可以使用 Redshift Spectrum 创建一个外部表,该表可以访问文件而无需将它们加载到 Redshift。然后,您可以构造一个执行 INSERT 的查询,其中 ID 大于 Redshift 表中使用的最后一个 ID。

也许我应该解释得简单一点……

  • Redshift 中的表 existing_table 已包含最多为 id = 2 的行
  • CREATE EXTERNAL TABLE in_data 指向 S3 中包含数据的文件
  • 使用INSERT INTO existing_table SELECT * FROM in_data WHERE id > (SELECT MAX(id) FROM existing_table

理论上,这应该只将新行加载到表中。

【讨论】:

    猜你喜欢
    • 2018-09-12
    • 2014-01-30
    • 1970-01-01
    • 2016-09-25
    • 2013-03-20
    • 2014-10-16
    • 2018-07-18
    • 2018-04-25
    • 1970-01-01
    相关资源
    最近更新 更多