将来自 amazon s3 的大型 CSV 处理到 postgres 数据库表中

问题描述 投票:0回答:1

我需要处理从 AWS S3 到 Postgres DB (AWS RDS) 的大型 CSV。我是 AWS 新手,需要一些有关架构的建议。以下是要求。

  1. 我们每天都会在 S3 存储桶中收到一个 CSV 文件。文件大小为 200,000 条记录 ~ 0.5 GB。
  2. 我们需要处理记录,应用一些转换,然后将数据加载到 Postgres 数据库 (AWS RDS) 中的表中

一些具体问题:

  1. 我正在寻找一种可重复且自动化的解决方案,而不是手动。
  2. 处理效率是优先考虑的,但不需要超快(因此可以优化成本)。
  3. 如果建议流式传输文件,我们如何处理失败?如果处理在文件中间停止,有没有办法从失败点重新启动,或者我们需要从头开始,并处理下游进程/数据库中的重复项?
  4. 文件处理完毕后,我们如何重命名或移动它,以免再次处理?最佳实践是什么?

谢谢你。

amazon-web-services amazon-s3
1个回答
0
投票

您可以使用 aws_s3 扩展将数据从 Amazon S3 导入到 RDS for PostgreSQL 数据库实例 - Amazon Relational Database Service

。它使用 Postgres COPY 命令从 S3 加载 CSV 样式的数据。

最困难的部分是触发它并知道S3中的哪些对象需要处理。

我遇到过一种情况,我们每天都将具有“相同文件名”的文件转储到 S3 中,再加上包含数据转储时间的附加文件。我们使用

pg_cron扩展每半小时查看一次文件。 psql 存储过程将检查“时间戳”文件并将日期与上次加载时间进行比较。如果不同,存储过程将加载所有文件。

如果您的情况是添加具有不同文件名

的文件,那么情况会更加困难,因为 psql 存储过程无法列出 S3 中的对象。相反,您可以

使用 Amazon S3 触发器来调用 AWS Lambda 函数,该函数可以: 连接到 Postgres 并直接运行导入命令,或者

    将清单文件写入 S3,供与上述类似的进程使用(例如,每 x 分钟检查一次清单,加载提到的文件,将加载的文件的名称添加到另一个表以避免重复加载)
  • 或者,您似乎也可以使用
  • AWS Glue
来触发导入过程。我还没有尝试过,但这里有一篇文章:

将 AWS Glue 与 Postgresql 结合使用的实用方法 - DEV 社区

© www.soinside.com 2019 - 2024. All rights reserved.