我需要将压缩文件从一个 AWS S3 文件夹复制到另一个文件夹,并希望将其作为计划的 AWS Glue 作业。我找不到这样一个简单任务的例子。如果你知道答案,请帮忙。答案可能在 AWS Lambda 或其他 AWS 工具中。
非常感谢!
您可以这样做,并且可能有使用 AWS Glue 的理由:如果您已链接 Glue 作业并glue_job_#2
在成功完成glue_job_#1
.
下面的简单 Python 脚本使用库将文件从一个 S3 文件夹 ( source
) 移动到另一个文件夹 ( ) ,并可选择删除目录中的原始副本。target
boto3
source
import boto3
bucketname = "my-unique-bucket-name"
s3 = boto3.resource('s3')
my_bucket = s3.Bucket(bucketname)
source = "path/to/folder1"
target = "path/to/folder2"
for obj in my_bucket.objects.filter(Prefix=source):
source_filename = (obj.key).split('/')[-1]
copy_source = {
'Bucket': bucketname,
'Key': obj.key
}
target_filename = "{}/{}".format(target, source_filename)
s3.meta.client.copy(copy_source, bucketname, target_filename)
# Uncomment the line below if you wish the delete the original source file
# s3.Object(bucketname, obj.key).delete()
参考:Boto3 Docs on S3 Client Copy
注意:我将f-strings
用于生成target_filename
, 但 f 字符串仅在 >= Python3.6 中受支持,我相信默认的 AWS Glue Python 解释器仍然是 2.7。
我认为您可以使用 Glue 来做到这一点,但是使用 CLI 不是更容易吗?
您可以执行以下操作:
aws s3 sync s3://bucket_1 s3://bucket_2
您可以使用 Glue 来做到这一点,但它不是适合这项工作的工具。
让一个由 S3 创建对象事件触发的 Lambda 作业要简单得多。AWS Docs 上甚至有一个关于(几乎)做这件事的教程。
http://docs.aws.amazon.com/lambda/latest/dg/with-s3-example.html
我们最终使用 Databricks 来完成所有工作。
胶水没有准备好。它返回没有意义的错误消息。我们创建了工单,等了五天仍然没有回复。
S3 API 允许您执行 COPY 命令(实际上是带有标头以指示源 URL 的 PUT)以在存储桶内或存储桶之间复制对象。它用于定期伪造 rename()s,但您可以自己发起呼叫,从任何东西。
无需 D/L 任何数据;在同一个 S3 区域内,副本的带宽约为 6-10 MB/s。
AWS CLI cp 命令可以执行此操作。
您可以通过将 zip 文件从 s3 下载到tmp/
目录,然后将其重新上传到 s3 来做到这一点。
s3 = boto3.resource('s3')
s3.Bucket(bucket_name).download_file(DATA_DIR+file,'tmp/'+file)
s3.meta.client.upload_file('tmp/'+file,bucket_name,TARGET_DIR+file)
现在您可以用胶水编写 python shell 作业来完成它。只需Type
在 Glue 作业创建向导中选择Python Shell
. 您可以在其中运行普通的 python 脚本。
什么都不需要。我相信 aws 数据管道是一个最佳选择。只需使用命令行选项。预定运行也是可能的。我已经试过了。成功工作。