我们可以使用 AWS Glue 将文件从一个 S3 文件夹复制到另一个 S3 文件夹吗?
Could we use AWS Glue just copy a file from one S3 folder to another S3 folder?
我需要将压缩文件从一个 AWS S3 文件夹复制到另一个文件夹,并希望将其设为计划的 AWS Glue 作业。我找不到这样一个简单任务的例子。如果您知道答案,请帮忙。答案可能在 AWS Lambda 或其他 AWS 工具中。
非常感谢!
我认为您可以使用 Glue 来完成,但是使用 CLI 不是更容易吗?
您可以执行以下操作:
aws s3 sync s3://bucket_1 s3://bucket_2
您可以使用 Glue 执行此操作,但它不是完成这项工作的正确工具。
让 Lambda 作业由 S3 创建对象事件触发要简单得多。 AWS Docs 上什至有一个关于(几乎)做这件事的教程。
http://docs.aws.amazon.com/lambda/latest/dg/with-s3-example.html
我们最终使用 Databricks 来做所有事情。
胶水还没准备好。它 returns 没有意义的错误消息。我们创建了工单并等待了五天仍然没有回复。
您可以将 zip 文件从 s3 下载到 tmp/
目录,然后将其重新上传到 s3。
s3 = boto3.resource('s3')
下载文件到本地spark目录tmp:
s3.Bucket(bucket_name).download_file(DATA_DIR+file,'tmp/'+file)
从本地 spark 目录上传文件 tmp:
s3.meta.client.upload_file('tmp/'+file,bucket_name,TARGET_DIR+file)
S3 API 允许您执行 COPY 命令(实际上是带有 header 的 PUT 以指示源 URL)以在存储桶内或存储桶之间复制 objects。它用于定期伪造 rename(),但您可以从任何地方自己发起调用。
不需要D/L任何数据;在同一 S3 区域内,副本的带宽约为 6-10 MB/s。
AWS CLI cp command 可以做到这一点。
您可以这样做,并且可能有使用 AWS Glue 的原因:如果您已链接 Glue 作业并且 glue_job_#2
在成功完成 glue_job_#1
时触发。
下面的简单 Python 脚本使用 boto3
库将文件从一个 S3 文件夹 (source
) 移动到另一个文件夹 (target
),并可选择删除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()
Reference: Boto3 Docs on S3 Client Copy
注意:我会使用 f-strings
生成 target_filename
,但 f 字符串仅在 >= Python3.6 中受支持,我相信默认的 AWS Glue Python 解释器仍然是 2.7.
现在您可以在 glue 中编写 python shell 作业来完成它。只需 select Type
在 Glue job Creation 向导中到 Python Shell
。您可以在其中 运行 正常 python 脚本。
不需要任何内容。我相信 aws 数据管道是最好的选择。只需使用命令行选项。预定运行也可以。我已经试过了。成功工作。
我需要将压缩文件从一个 AWS S3 文件夹复制到另一个文件夹,并希望将其设为计划的 AWS Glue 作业。我找不到这样一个简单任务的例子。如果您知道答案,请帮忙。答案可能在 AWS Lambda 或其他 AWS 工具中。
非常感谢!
我认为您可以使用 Glue 来完成,但是使用 CLI 不是更容易吗?
您可以执行以下操作:
aws s3 sync s3://bucket_1 s3://bucket_2
您可以使用 Glue 执行此操作,但它不是完成这项工作的正确工具。
让 Lambda 作业由 S3 创建对象事件触发要简单得多。 AWS Docs 上什至有一个关于(几乎)做这件事的教程。
http://docs.aws.amazon.com/lambda/latest/dg/with-s3-example.html
我们最终使用 Databricks 来做所有事情。
胶水还没准备好。它 returns 没有意义的错误消息。我们创建了工单并等待了五天仍然没有回复。
您可以将 zip 文件从 s3 下载到 tmp/
目录,然后将其重新上传到 s3。
s3 = boto3.resource('s3')
下载文件到本地spark目录tmp:
s3.Bucket(bucket_name).download_file(DATA_DIR+file,'tmp/'+file)
从本地 spark 目录上传文件 tmp:
s3.meta.client.upload_file('tmp/'+file,bucket_name,TARGET_DIR+file)
S3 API 允许您执行 COPY 命令(实际上是带有 header 的 PUT 以指示源 URL)以在存储桶内或存储桶之间复制 objects。它用于定期伪造 rename(),但您可以从任何地方自己发起调用。
不需要D/L任何数据;在同一 S3 区域内,副本的带宽约为 6-10 MB/s。
AWS CLI cp command 可以做到这一点。
您可以这样做,并且可能有使用 AWS Glue 的原因:如果您已链接 Glue 作业并且 glue_job_#2
在成功完成 glue_job_#1
时触发。
下面的简单 Python 脚本使用 boto3
库将文件从一个 S3 文件夹 (source
) 移动到另一个文件夹 (target
),并可选择删除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()
Reference: Boto3 Docs on S3 Client Copy
注意:我会使用 f-strings
生成 target_filename
,但 f 字符串仅在 >= Python3.6 中受支持,我相信默认的 AWS Glue Python 解释器仍然是 2.7.
现在您可以在 glue 中编写 python shell 作业来完成它。只需 select Type
在 Glue job Creation 向导中到 Python Shell
。您可以在其中 运行 正常 python 脚本。
不需要任何内容。我相信 aws 数据管道是最好的选择。只需使用命令行选项。预定运行也可以。我已经试过了。成功工作。