Имена файлов деревянных паркетов, созданные pyarrow на S3

Мы добавляем данные в существующий набор данных паркета, хранящийся в S3 (секционированный), с помощью pyarrow. Это выполняется на AWS lambda несколько раз в час. Минимальный пример:

import pyarrow as pa
import pyarrow.parquet as pq
import s3fs

df = ... # Existing pandas df

table = pa.Table.from_pandas(df)

pq.write_to_dataset(
   table, 
   filesystem=s3,
   root_path=f"s3://s3-path/",
   partition_cols=['year', "month"]
)

В результате в S3 будет записано несколько паркетных файлов в зависимости от значений внутренних данных. Наша цель - отследить, какие файлы были записаны в файловую систему, путем вывода их результирующего имени файла (ключ S3).

Есть ли способ зафиксировать фактическое имя файла, записанное pyarrow или s3fs? Имена файлов Parquet произвольно называются в соответствии с вычисленным хеш-именем, и я не вижу никаких функций ведения журнала ни для одного из двух упомянутых пакетов.

3 ответа

Решение

Начиная с версии 0.15.0 вы можете указать имена какpartition_filename_cb для ваших файлов перед записью.

pyarrow.parquet.write_to_dataset(table, root_path, partition_cols=None, partition_filename_cb=None, filesystem=None, **kwargs)

Если вы готовы также использовать AWS Data Wrangler:

import awswrangler as wr

paths = wr.pandas.to_parquet(
    dataframe=df,
    path="s3://...",
    dataset=True,
    database="my_database",  # Optional, only with you want it available on Athena/Glue Catalog
    table="my_table",
    partition_cols=["PARTITION_COL_NAME"])["paths"]

print(paths)

Просто чтобы уточнить ответ @Prabhakar Reddy ... для аргумента partition_filename_cb требуется функция обратного вызова. Просто используйте лямбду, если вы хотите предоставить строку, как показано ниже.

      pyarrow.parquet.write_to_dataset(table, root_path, partition_cols=None, partition_filename_cb=lambda x: 'myfilename.parquet', filesystem=None, **kwargs)
Другие вопросы по тегам