amazon-web-services - 将约 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 Athena 从输入表中“选择”行,并将这些行输出到位于不同路径中的目标表,并配置分区。但是,Athena 不会“移动”文件——它只是读取它们然后存储输出。如果每次都对新数据执行此操作,则需要使用INSERT
语句将新数据复制到现有输出表中,然后从 S3 中删除输入文件。
由于它是一次性的,并且每个文件只属于一个分区,因此我建议您简单地“运行脚本”。从 EC2 实例开始它会稍微快一些,但数据不会上传/下载——它都保留在 S3 中。
我经常创建一个包含输入位置和输出位置列表的 Excel 电子表格。我创建了一个公式来构建aws s3 cp <input> <output_path>
命令,将它们复制到文本文件并作为批处理执行。工作正常!
您提到目的地取决于对象内部的数据,因此它可能作为一个循环遍历每个对象的 Python 脚本运行良好,“窥视”对象内部以查看其所属位置,然后发出copy_object()
命令将其发送到正确的目的地。(smart-open · PyPI是一个很棒的库,无需先下载即可从 S3 对象中读取。)
推荐阅读
- azure - Azure 自定义角色:授权为一组特定角色分配角色
- asp.net - 在构建管道期间覆盖发布配置文件的发布文件夹 (url)
- javascript - 使用 componentDidUpdate 改变组件中的状态
- ios - Outlook for iOS 使用 ms-outlook://compose 删除空间
- python - 如何使用打字来强制使用特定的枚举作为python中的参数
- ios - Swift - Firestore 为数组元素创建子集合
- php - 如何将 json 添加为 url 的一部分?
- sql-server - SQL Server 2012 中 XML 元素的位置
- sql - 如何使用带有罗马数字和日期的 ORDER BY
- c# - 当插入结果没有显示时,如何检查值是否被插入到表中?