【问题标题】:S3 avoid loading of duplicate filesS3避免加载重复文件
【发布时间】:2018-10-14 16:10:22
【问题描述】:

我有以下工作流程。 我需要识别 S3 上的重复文件,以避免在我的目的地 (Redshift) 上出现重复。

  • 每 4 小时从 FTP 服务器将文件加载到 S3(文件存储结构:年/月/日/小时/分钟/文件名)
  • 在拉取所有文件后将 S3 加载到 Redshift(针对该时间间隔)

这是每 4 小时运行一次的连续作业。

问题:

有时,S3 上会出现内容相同但文件名不同的文件。这些文件可以属于不同的时间间隔或不同的日子。例如,如果文件在 2018 年 10 月 1 日到达 one.csv 并包含 1,2.3,4 作为内容,则可能在 2018 年 10 月 10 日到达的文件可能具有相同的内容 1,2,3,4 但具有不同的内容文件名。 如果内容相同,我想避免将此文件加载到 S3。 我知道我可以使用文件哈希来识别两个相同的文件,但我的问题是如何在 S3 上实现这一点,而且还有这么多文件。 最好的方法是什么?

基本上,我想避免将已经存在的数据加载到 S3。

【问题讨论】:

  • 我猜 ETag 和尺寸比较会是最快的。 stackoverflow.com/a/37064007。另请阅读如何确保 ETag 计算一致(即上传操作的哪些属性必须保持不变):docs.aws.amazon.com/AmazonS3/latest/API/…
  • 也许使用在放入 S3 的文件上触发的 Lambda。检索 etag(或以其他方式计算文件的哈希),然后在 DynamoDB 的“已经看到”表中查找。如果不存在,则将 etag/hash 存储在 DynamoDB 中。如果存在,则删除或以其他方式移动 S3 文件,使其不会加载到 Redshift。我建议将 etags/hash 持久化到 DynamoDB 的原因是查找比列出所有 S3 对象并检索它们的 etags 以进行重复查找要快得多。

标签: amazon-web-services amazon-s3


【解决方案1】:

您可以在 redshift 中添加另一个表(或其他任何地方,如 MySQL 或 dynamodb ),其中将包含上传文件的 Etag/md5 哈希。

您可能已经有一个脚本,该脚本每 4 小时运行一次,并将数据加载到 redshift。在同一个脚本中,数据成功加载到 redshift 后;只需在此表中输入。此外,在将数据加载到 Redshift 之前,在同一个脚本(来自这个新表)中进行检查。

您需要确保加载这个新表,其中包含您已经加载到 redshift 中的所有文件的 Etag。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-15
    • 1970-01-01
    • 1970-01-01
    • 2015-09-09
    • 2022-06-29
    • 2019-06-28
    相关资源
    最近更新 更多