Динамически читать изменение имени файла ключа - PullRequest
0 голосов
/ 10 марта 2020

У меня есть parquet файлы, сгенерированные с помощью spark, а имя файла (ключ) в s3 всегда изменит задание после ETL. Это код, который я использую для чтения файлов parquet через boto3 в sagemaker. Ищите способ динамически читать имя файла (ключ) S3, поскольку жесткое кодирование ключа приведет к сбою чтения, так как он меняется каждый раз. Как этого достичь? Спасибо.

filename = "datasets/randomnumbergenerator.parquet"
bucketName = "bucket-name"

buffer = io.BytesIO()
client = boto3.resource("s3")
obj = client.Object(bucketName, filename)
obj.download_fileobj(buffer)
df = pd.read_parquet(buffer)

Ответы [ 2 ]

1 голос
/ 10 марта 2020
import fnmatch

filename = "datasets/randomnumbergenerator.parquet"
bucketName = "bucket-name"

buffer = io.BytesIO()
client = boto3.resource("s3")
bucket = client.Bucket(bucketName)
for bucket_object in bucket.objects.all():
    if fnmatch.fnmatch(bucket_object.key, 'datasets/*.parquet'):
        print(bucket_object.key)

Вы хотите получить список объектов из корзины, затем вы можете go просмотреть объекты, которые вы ищете.

Обновление: вы можете использовать fnmatch внутри l oop, чтобы ограничить все, что вы знаете о файле (предполагается, что с текущим кодом он находится в папке с именем "наборы данных" и имеет тип parquet). Это вернет все объекты в корзине, которые соответствуют этому.

0 голосов
/ 10 марта 2020

Это решение работает для меня.

import boto3
import pandas as pd
import io
import pyarrow
import fastparquet

def dynamically_read_filename_key(bucket, prefix='', suffix=''):
    s3 = boto3\
    .client("s3",\
            region_name=os.environ['AWS_DEFAULT_REGION'],\
            aws_access_key_id=os.environ['AWS_ACCESS_KEY_ID'],\
            aws_secret_access_key=os.environ['AWS_SECRET_ACCESS_KEY'])
    kwargs = {'Bucket': bucket}
    if isinstance(prefix, str):
        kwargs['Prefix'] = prefix
    resp = s3\
    .list_objects_v2(**kwargs)
    for obj in resp['Contents']:
        key = obj['Key']
    if key.startswith(prefix) and key.endswith(suffix):
        return key

filename = "".join(i for i in dynamically_read_filename_key\
                   (bucket="my-bucket",\
                    prefix="datasets/",\
                    suffix=".parquet"))

bucket = "my-bucket"

def parquet_read_filename_key(bucket, filename):
    client = boto3\
    .resource("s3",\
            region_name=os.environ['AWS_DEFAULT_REGION'],\
            aws_access_key_id=os.environ['AWS_ACCESS_KEY_ID'],\
            aws_secret_access_key=os.environ['AWS_SECRET_ACCESS_KEY'])
    buffer = io.BytesIO()
    obj = client.Object(bucket, filename)
    obj.download_fileobj(buffer)
    df = pd.read_parquet(buffer)
    return df

df = parquet_read_filename_key(bucket, filename)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...