我正在构建一个数据管道,该数据管道将数据从s3加载到Amazon redshift,我有一个带有分层文件夹结构的s3存储桶,例如
Amazon S3>bucket-name/10849813427/2.0/2018/08/16/10958160321
,我的文件放在最后一个目录中(例如10958160321)。
我的S3存储桶(存储桶名称)中有多个这样的文件夹,现在我要从该S3存储桶中的所有这些文件夹中复制最近两天内具有“ last_modified_date”的文件到另一个S3存储桶中。我将使用ETL作业处理这些文件,并将数据加载到Redshift中。
在复制到另一个存储桶或同一存储桶中的另一个文件夹时,是否可以过滤出文件?
谢谢
答案 0 :(得分:2)
您不能使用S3修改任何对象。如果要更改现有对象,则需要删除现有对象并用新对象覆盖。这包括重命名及其元数据。
S3元数据:
https://docs.aws.amazon.com/AmazonS3/latest/dev/UsingMetadata.html
您可以指定或循环多个日期以查找相应的日期。
DATE=$(date +%Y-%m-%d)
aws s3 ls s3://bucket/2018/ --recursive | grep $DATE
关于可伸缩性,如果您有更多对象,则在收集带有修改日期的对象列表时会遇到计时问题。
S3广告资源:
如果可以接受24小时的延迟来收集对象列表,则可以使用S3清单来列出对象及其创建日期。
https://docs.aws.amazon.com/AmazonS3/latest/dev/storage-inventory.html
库存将交付到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
EDIT1:
用于从源复制到目标的简单循环的实际脚本
#!/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
希望有帮助。