将S3文件分割成1000行的较小文件

时间:2019-05-14 23:42:20

标签: python amazon-web-services amazon-s3 aws-lambda

我在S3上有一个文本文件,大约有3亿行。我希望将此文件拆分为每个1,000行的较小文件(最后一个文件包含其余部分),然后将其放入S3上的另一个文件夹或存储桶中。

到目前为止,我已经使用linux命令在本地驱动器上运行了此代码:

split -l 1000 file

将原始文件分割为1000行的较小文件。但是,对于像这样的较大文件,从本地驱动器下载然后重新上传回S3似乎效率很低。

最好使用Python(在Lambda函数中)或使用其他S3命令来分割此S3文件的最有效方法是什么?仅在本地驱动器上运行它会更快吗?

2 个答案:

答案 0 :(得分:2)

您的方法听起来不错(下载,拆分,上传)。

您应该在与Amazon S3存储桶相同的区域中的Amazon EC2实例中运行命令

使用AWS Command-Line Interface (CLI)下载/上传文件:

aws s3 cp s3://my-bucket/big-file.txt .

aws s3 cp --recursive folder-with-files s3://my-bucket/destination-folder/

答案 1 :(得分:2)

您要做的任何事情都必须下载文件,分割文件并重新上传。唯一的问题是位置,以及是否涉及本地磁盘。

John Rotenstein 给出了一个在EC2实例上使用本地磁盘的示例。这具有在AWS数据中心中运行的优势,因此它获得了高速连接,但有以下限制:(1)您需要磁盘空间来存储原始文件及其片段,并且(2)您需要一个EC2实例在哪里可以做到这一点。

一个小的优化是通过使用连字符作为s3 cp的目的地来避免大文件的本地副本:这会将输出发送到标准输出,然后您可以将其通过管道传递到{{ 1}}(在这里我也使用连字符来指示split从标准输入读取):

split

同样,这需要EC2实例在其上运行,以及输出文件的存储空间。但是,aws s3 cp s3://my-bucket/big-file.txt - | split -l 1000 - output. aws s3 cp output.* s3://dest-bucket/ 有一个标志,可让您为拆分中的每个文件运行shell命令:

split

因此,现在您已经消除了本地存储的问题,但是剩下的问题是在何处运行它。我的建议是AWS Batch,它可以在执行命令所需的时间内启动一个EC2实例。

您当然可以在Lambda上编写Python脚本来执行此操作,这将具有在将源文件上传到S3时自动触发的好处。我对Python SDK(boto)不太熟悉,但是看来get_object会以stream of bytes的形式返回原始文件的主体,然后您可以将其迭代为一行,累积多少行您想要进入每个输出文件。