Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 将文件从一个S3存储桶移动到另一个存储桶,并在最近两天内更新_Python_Amazon S3_Aws Lambda_Etl - Fatal编程技术网

Python 将文件从一个S3存储桶移动到另一个存储桶,并在最近两天内更新

Python 将文件从一个S3存储桶移动到另一个存储桶,并在最近两天内更新,python,amazon-s3,aws-lambda,etl,Python,Amazon S3,Aws Lambda,Etl,我正在构建一个数据管道,将数据从s3加载到AmazonRedshift,我有一个具有分层文件夹结构的s3 bucket,例如 Amazon S3>bucket-name/10849813427/2.0/2018/08/16/10958160321 我的文件放在最后一个目录中,例如10958160321 在我的S3 bucketbucket名称中有多个这样的文件夹,现在从这个S3 bucket中的所有这些文件夹中,我想将最近两天内最后修改日期的文件复制到另一个S3 bucket中。我将使

我正在构建一个数据管道,将数据从s3加载到AmazonRedshift,我有一个具有分层文件夹结构的s3 bucket,例如

Amazon S3>bucket-name/10849813427/2.0/2018/08/16/10958160321 
我的文件放在最后一个目录中,例如10958160321

在我的S3 bucketbucket名称中有多个这样的文件夹,现在从这个S3 bucket中的所有这些文件夹中,我想将最近两天内最后修改日期的文件复制到另一个S3 bucket中。我将使用我的ETL作业处理这些文件,并在红移中加载数据

在复制到另一个bucket或同一bucket中的另一个文件夹时,是否有方法过滤掉文件


谢谢

您不能使用S3修改任何对象。如果要更改现有对象,则需要删除现有对象并用新对象覆盖。这包括重命名及其元数据

S3元数据:

您可以指定或循环多个日期以查找各自的日期

DATE=$(date +%Y-%m-%d)
aws s3 ls s3://bucket/2018/ --recursive | grep $DATE
关于可伸缩性,如果您有更多的对象,那么在收集带有修改日期的对象列表时会遇到时间问题

S3库存:

如果可以接受24小时延迟来收集对象列表,则可以使用S3清单列出对象及其创建日期

库存将被发送到s3存储桶,您可以触发lambda,读取内容并将对象移动到正确的位置

S3副本:

可以使用cli/lambda在存储桶之间或同一存储桶内进行复制

aws s3 mv s3://bucket1/folder1  s3://bucket1/folder2  --recursive
aws s3 mv s3://bucket1/folder1  s3://bucket1/folder1  --recursive
编辑1:

用于从源复制到目标的简单循环的实际脚本

#!/bin/sh                                                                                                                  
aws s3api list-objects --bucket "bucket-name" --prefix "prefix/foldername" --query "Contents[?LastModified>='2018-10-02'].{Key: Key}" --profile production | tr '\n' ' ' | jq -c '.[].Key' | while read i; do                                         
    aws s3 mv s3://sourbucket/$i s3://destinationbucket/                                                            
done

希望能有所帮助。

感谢您的回复,这给了我很多进一步浏览的机会,我要寻找的是,如果我可以在将文件复制到另一个存储桶或文件夹时通过一个过滤器,就像您在上一个示例中提到的那样,我可以执行类似以下操作:aws s3 mv s3://bucket1/folder1 s3://bucket1/folder2-递归查询'内容吗[?上次修改>='2018-09-29']另外,我需要动态地给出日期,我是否可以使用类似sysdate的东西,而不是硬编码日期'2018-09-29'!添加了一个脚本,使您变得更懒:。希望它有帮助。谢谢,它确实很有帮助,但由于某些原因,我最终使用Pythonboto3完成任务:,我能够找到这种情况的密钥。请检查您的版本首先是awscli。升级awscli 1.11.47->1.16.220后工作。谢谢。只需在最后一个jq命令中添加-r,它在awscli 1.16上对我有效。根据您的以下评论,您是否能够发布您的boto3解决方案或接受以下答案: