【问题标题】:Airflow : Download latest file from S3 with Wildcard气流:使用通配符从 S3 下载最新文件
【发布时间】:2020-09-02 21:03:15
【问题描述】:

要求:从 s3 下载最新文件,即当前文件

s3 中的示例文件

bucketname/2020/09/reporting_2020_09_20200902000335.zip
bucketname/2020/09/reporting_2020_09_20200901000027.zip

当我将 s3_src_key 作为/2020/09/reporting_2020_09_20200902 传递时不适用于以下一个

代码:

 with tempfile.NamedTemporaryFile('r') as f_source, tempfile.NamedTemporaryFile('w') as f_target:
     s3_client.download_file(self.s3_src_bucket, self.s3_src_key, f_source.name)

下面一个可以正常工作

import os
bucket = 'bucketname'
key = '/2020/09/reporting_2020_09_20200902'
s3_resource = boto3.resource('s3')
my_bucket = s3_resource.Bucket(bucket)
objects = my_bucket.objects.filter(Prefix=key)
for obj in objects:
    path, filename = os.path.split(obj.key)
    my_bucket.download_file(obj.key, filename)

我需要帮助如何在 Airflow 中使用通配符

【问题讨论】:

  • 我猜你会遍历存储桶中的对象,按从文件名中提取的日期对它们进行排序,然后选择第一个。
  • 如何定义“最新文件”?您是基于指示对象何时存储在 Amazon S3 中的 LastModified 日期,还是基于对文件名的解释?如果您使用文件名,在给定文件夹名称和文件名(键)的情况下,查找“最新文件”的规则是什么?它会一直说reporting_吗?另外,为什么年+月列出了 3 次(2020/092020_09202009)?如果他们意见不一致怎么办?
  • 这就是供应商发送文件的方式:) .. 是的,我得到了reporting_ 文件,基于此处的文件名示例reporting_2020_09_20200902 是今天的文件。我也可以使用 LastModifiedDate 但我认为前缀是文件名比较容易

标签: python python-3.x boto3 airflow


【解决方案1】:

您可以列出与给定模式匹配的对象,但随后您需要编写代码来确定其中哪一个是最新的。

这是您需要的Python SDK function

【讨论】:

    猜你喜欢
    • 2020-01-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多