我们可以使用AWS Glue将文件从一个S3文件夹复制到另一个S3文件夹吗?

时间:2017-12-05 22:53:07

标签: amazon-s3 aws-glue

我需要将压缩文件从一个AWS S3文件夹复制到另一个文件夹,并希望将其作为预定的AWS Glue作业。我找不到这么简单的任务的例子。如果你知道答案,请帮忙。可能是AWS Lambda或其他AWS工具的答案。

非常感谢!

8 个答案:

答案 0 :(得分:2)

我认为你可以用Glue做到这一点,但是使用CLI会不会更容易?

您可以执行以下操作:

aws s3 sync s3://bucket_1 s3://bucket_2

答案 1 :(得分:1)

你可以用胶水做到这一点,但它不适合这项工作。

更简单的方法是让S3创建对象事件触发Lambda作业。甚至还有一篇关于AWS Docs的教程(几乎)正在做这件事。

http://docs.aws.amazon.com/lambda/latest/dg/with-s3-example.html

答案 2 :(得分:1)

我们最终使用Databricks来做所有事情。

胶水尚未准备好。它返回没有意义的错误消息。我们创建了门票并等了五天仍然没有回复。

答案 3 :(得分:1)

通过S3 API,您可以执行COPY命令(实际上是带有标头以指示源URL的PUT)以在存储桶内或存储桶之间复制对象。它曾经经常伪造rename(),但您可以自己发起呼叫,而不管任何事情。

无需D / L任何数据;在同一S3区域内,副本的带宽约为6-10 MB / s。

AWS CLI cp command可以执行此操作。

答案 4 :(得分:1)

您可以做到这一点,有可能是一个理由使用AWS胶水:如果您链接胶作业和glue_job_#2被触发的顺利完成glue_job_#1

下面的简单Python脚本使用source库将文件从一个S3文件夹(target)移到另一个文件夹(boto3),并有选择地删除{{ 1}}目录。

source

Reference: Boto3 Docs on S3 Client Copy

注意:我将使用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() 来生成f-strings,但是> = Python3.6仅支持f字符串,并且我相信默认的AWS Glue Python解释器仍为2.7。

Reference: PEP on f-strings

答案 5 :(得分:0)

您可以通过将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)

答案 6 :(得分:0)

现在,您可以用胶水编写python shell作业来做到这一点。只需在粘胶作业创建向导中选择Type即可。您可以在其中运行普通的python脚本。

答案 7 :(得分:0)

不需要任何内容​​。我相信AWS数据管道是最佳选择。只需使用命令行选项即可。预定运行也是可能的。我已经尝试过了工作成功。