Группировка файлов S3 в подпапки

avatar
TomLenzmeier
1 июля 2021 в 18:31
225
1
-1

У меня есть конвейер, который перемещает примерно 1 ТБ данных, все файлы CSV. В этом пайплайне сотни файлов с разными именами. У них есть компонент даты, который автоматически разделяется. Мой вопрос заключается в том, как использовать CDK для автоматического создания подпапок на основе имени файла. Другими словами, данные относятся к широкой категории, но нашим специалистам по обработке и анализу данных они нужны еще на одном уровне детализации.

Источник
John Rotenstein
1 июля 2021 в 22:44
0

Это не похоже на то, что AWS CDK может сделать. Это должно выполняться «конвейером» или как процесс после конвейера (например, S3 запускает функцию AWS Lambda, которая «перемещает» объекты).

TomLenzmeier
2 июля 2021 в 23:36
0

Хорошо, какие-нибудь предложения о том, как написать скрипт на Python?

Ответы (1)

avatar
John Rotenstein
3 июля 2021 в 00:46
0

Похоже, вам нужно перемещать входящие объекты в папки на основе информации в их имени файла (ключ).

Это можно сделать, добавив триггер в корзину Amazon S3, который запускает функцию AWS Lambda при создании нового объекта.

Вот код из Перемещение файла на основе имени файла с помощью Amazon S3:

import boto3
import urllib

def lambda_handler(event, context):
    
    # Get the bucket and object key from the Event
    bucket = event['Records'][0]['s3']['bucket']['name']
    key = urllib.parse.unquote_plus(event['Records'][0]['s3']['object']['key'])
    
    # Only copy objects that were uploaded to the bucket root (to avoid an infinite loop)
    if '/' not in key:
        
        # Determine destination directory based on Key
        directory = key # Your logic goes here to extract the directory name
      
        # Copy object
        s3_client = boto3.client('s3')
        s3_client.copy_object(
            Bucket = bucket,
            Key = f"{directory}/{key}",
            CopySource= {'Bucket': bucket, 'Key': key}
        )
        
        # Delete source object
        s3_client.delete_object(
            Bucket = bucket,
            Key = key
        )

Вам потребуется изменить код, который определяет имя целевого каталога на основе key нового объекта.<99492055595546>

Также предполагается, что новые объекты будут поступать в верхний уровень (корневой) корзины, а затем перемещаться в подкаталоги. Если вместо этого новые объекты поступают по заданному пути (например, incoming/), то только установите триггер S3 для работы на этом пути и удалите логику if '/' not in key.