Воздушный поток: загрузить последнюю версию файла с S3 с подстановочным знаком

#python #python-3.x #boto3 #airflow

#python #python-3.x #boto3 #воздушный поток

Вопрос:

Требование: загрузить последний файл, т. Е. текущий файл с 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

Комментарии:

1. Я предполагаю, что вы бы перебрали объекты в корзине, отсортировали их по дате, извлеченной из имени файла, а затем выбрали бы первый.

2. Как вы определяете «последний файл»? Будете ли вы основывать это на LastModified дате, которая указывает, когда объект был сохранен в Amazon S3, или вы основываете это на интерпретации имени файла? Если вы используете имя файла, каково правило для поиска «последнего файла», учитывая имя папки и имя файла (ключ)? Всегда ли он будет говорить reporting_ ? Кроме того, почему год месяц указаны 3 раза ( 2020/09 , 2020_09 и 202009 )? Что, если они не согласны друг с другом?

3. Вот как поставщик отправляет файлы 🙂 .. Да, я получаю reporting_ files, основываясь на примере имени файла здесь reporting_2020_09_20200902 — это сегодняшний файл. Я также могу использовать LastModifiedDate, Но я подумал, что префикс с именем файла проще

Ответ №1:

Вы можете перечислить объекты, соответствующие заданному шаблону, но тогда вам нужно будет написать код, который определяет, какой из них является последним.

Вот функция Python SDK, которая вам понадобится