将 S3 文件合并为多个 <1GB S3 文件



我在一个桶中有多个S3文件。

Input S3 bucket : 
File1 - 2GB data
File 2 - 500MB data
File 3 - 1Gb Data
file 4 - 2GB data

等等。假设有50个这样的文件。文件中的数据具有相同的模式,例如attribute1, attribute 2

我想将这些文件合并并输出到一个新的桶中,如下所示,以便每个文件在相同的模式下小于1GB。

Files 1 - < 1GB 
Files 2 - < 1GB
Files 3 - < 1GB

我正在寻找基于AWS的解决方案,我可以使用AWS CDK交付。我正在考虑以下两种解决方案:

  1. AWS Athena -读取和写入S3,但不确定我是否可以在写入时设置1GB限制。
  2. AWS Lambda -顺序读取文件,存储在内存中,当大小接近1GB时,写入s3桶中的新文件。重复,直到所有文件完成。我担心15分钟超时,不确定lambda是否能够处理。

预期比例->总文件输入大小总和:1tb

实现这一点的好方法是什么?希望我的问题措辞正确,如果有任何疑问,我很乐意评论。

谢谢!

编辑:基于评论->很抱歉我把它叫做合并。更多的是重置。所有文件都有相同的模式,放在csv文件中。根据伪代码

List<Files> listOfFiles = ReadFromS3(key)
New file named temp.csv
for each file : listOfFiles : 
append file to temp.csv
List<1GBGiles> finalList = Break down temp.csv into sets of 1GB each
for(File file : finalList) 
writeToS3(finalList)

Amazon Athena可以在给定的Amazon S3路径中跨多个对象运行查询,只要它们都具有相同的格式(例如CSV文件中的相同列)。

它可以通过使用CREATE TABLE AS命令和LOCATION参数将结果存储在一个新的外部表中,该表的位置指向S3桶。

可以通过设置输出桶的数量来控制输出文件的大小(这是而不是与S3桶相同)。

:

  • bucket vs partitioning - Amazon Athena
  • 设置Amazon Athena中CTAS查询的文件数量或大小

如果您的流程包括ETL(提取转换加载)后期流程,您可以使用AWS GLUE请在这里找到一个使用s3作为源的Glue示例。如果您想将它与Java SDK一起使用,最好的起点是:

  • Glue GitHub repo
  • Glue的aws Java代码样例目录

在所有这些中,您的教程创建一个爬虫(您可以在GitHub中找到上述url)应该匹配您的情况,因为它爬行S3桶并将其放在胶水目录中进行转换。

最新更新