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

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

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

到目前为止,我一直在使用 linux 命令在本地驱动器上运行它:

split -l 1000 file

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

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

python amazon-web-services amazon-s3 aws-lambda
3个回答
19
投票

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

John Rotenstein 为您提供了在 EC2 实例上使用本地磁盘的示例。这样做的好处是在 AWS 数据中心中运行,因此可以获得高速连接,但也有以下限制:(1) 您需要磁盘空间来存储原始文件及其片段,(2) 您需要 EC2 实例你可以在哪里做到这一点。

一个小的优化是通过使用连字符作为

s3 cp
的目的地来避免大文件的本地副本:这会将输出发送到标准输出,然后您可以将其通过管道传输到
split
(这里我我还使用连字符告诉 split 从标准输入读取):

aws s3 cp s3://my-bucket/big-file.txt - | split -l 1000 - output.
aws s3 cp output.* s3://dest-bucket/

同样,这需要一个 EC2 实例来运行它,以及输出文件的存储空间。但是,有一个

split
标志可以让您为拆分中的每个文件运行 shell 命令:

aws s3 cp s3://src-bucket/src-file - | split -b 1000 --filter 'aws s3 cp - s3://dst-bucket/result.$FILE' -

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

当然,您可以编写一个 Python 脚本在 Lambda 上执行此操作,这样做的好处是当源文件上传到 S3 时自动触发。我对 Python SDK (boto) 不太熟悉,但 get_object 似乎会以 字节流 的形式返回原始文件的主体,然后您可以将其作为行进行迭代,累积您想要的行数到每个输出文件中。


3
投票

你的方法看起来不错(下载、拆分、上传)。

您应该从与 Amazon S3 存储桶位于同一区域的 Amazon EC2 实例运行命令。

使用 AWS 命令行界面 (CLI) 下载/上传文件:

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

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

0
投票

aws s3 cp s3://tptmportaldev/Funds1.csv - | split -b 10 --filter 'aws s3 cp - s3://tptmportaldev/Funds1_$FILE.csv' -

以上命令处于挂起状态。我有一个包含 20 条记录的文件,想将此文件拆分为多个文件,每个文件记录 10 行。

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