首页 > 解决方案 > 将约 200.000 个 s3 文件复制到新前缀

问题描述

我有大约 200.000 个 s3 文件需要分区,并进行了 Athena 查询以为每个原始 s3 密钥生成目标 s3 密钥。我可以清楚地从中创建一个脚本,但是如何使该过程健壮/可靠?

我需要使用每个 csv 中的信息对 csv 文件进行分区,以便将每个文件移动到同一存储桶中的新前缀。文件是一对一映射的,但新前缀取决于文件内的数据

每个的复制命令将类似于:

aws s3 cp s3://bucket/top_prefix/file.csv s3://bucket/top_prefix/var1=X/var2=Y/file.csv

而且我可以制作一个大脚本来复制所有通过 Athena 和一些 SQL,但我担心这样做是否可靠,以便我可以确保所有内容都被复制,并且不会让脚本失败、超时等。我应该“只运行脚本”?从我的机器上还是更好地将它放在 ec2 1st 中?这类问题

这是一次性的,因为在 s3 中生成文件的应用程序代码将开始直接输出到分区。

标签: amazon-web-servicesamazon-s3

解决方案


如果每个文件只包含一个分区的数据,那么您可以简单地移动文件,如图所示。这是非常有效的,因为不需要处理文件的内容。

但是,如果文件中的每个行都属于不同的分区,那么您可以使用 Amazon Athena 从输入表中“选择”行,并将这些行输出到位于不同路径中的目标表,并配置分区。但是,Athena 不会“移动”文件——它只是读取它们然后存储输出。如果每次都对新数据执行此操作,则需要使用INSERT语句将新数据复制到现有输出表中,然后从 S3 中删除输入文件。

由于它是一次性的,并且每个文件只属于一个分区,因此我建议您简单地“运行脚本”。从 EC2 实例开始它会稍微快一些,但数据不会上传/下载——它都保留在 S3 中。

我经常创建一个包含输入位置和输出位置列表的 Excel 电子表格。我创建了一个公式来构建aws s3 cp <input> <output_path>命令,将它们复制到文本文件并作为批处理执行。工作正常!

您提到目的地取决于对象内部的数据,因此它可能作为一个循环遍历每个对象的 Python 脚本运行良好,“窥视”对象内部以查看其所属位置,然后发出copy_object()命令将其发送到正确的目的地。(smart-open · PyPI是一个很棒的库,无需先下载即可从 S3 对象中读取。)


推荐阅读