仅从 S3 将新文件加载到 Redshift 的简单方法?

Evi*_*ter 5 amazon-s3 amazon-redshift

Redshift COPY 命令的文档指定了两种选择从 S3 加载文件的方法,您可以提供基本路径并加载该路径下的所有文件,或者指定包含要加载的特定文件的清单文件。

然而,在我们的例子中(我认为这很常见),S3 存储桶会定期接收包含更新数据的新文件。我们希望能够仅加载尚未加载的文件。

鉴于有一个表 stl_file_scan 记录了从 S3 加载的所有文件,因此最好以某种方式排除那些已成功加载的文件。这似乎是一个相当明显的功能,但我在文档或在线中找不到有关如何执行此操作的任何内容。

甚至 AWS Data Pipeline 中的 Redshift S3 加载模板似乎也可以通过将所有数据(新数据和旧数据)加载到临时表中,然后比较/更新插入到目标表来管理这种情况。当我们可以从文件名中得知文件已经被加载时,这似乎是一个疯狂的开销。

我知道我们可能可以将已经加载的文件移出存储桶,但是我们不能这样做,这个存储桶是另一个不属于我们自己的进程的最终存储位置。

我能想到的唯一替代方案是运行一些其他进程来跟踪已成功加载到 redshift 的文件,然后定期将其与 s3 存储桶进行比较以确定差异,然后在触发复制之前将清单文件写入某处过程。但多么痛苦啊!我们需要一个单独的 ec2 实例来运行该流程,该流程有自己的管理和运营开销。

一定会有更好的办法!

Kan*_*yan 4

这就是我解决问题的方法

S3 --(新创建的日志上的 Lambda 触发器)-- Lambda -- Firehose -- Redshift

它适用于任何规模。随着负载的增加,对 Lambda 的调用增多,传输的数据增多,一切都会自动处理。

如果文件格式存在问题,您可以配置死信队列,事件将发送到那里,并且您可以在修复 lambda 后重新处理。