Имена файлов деревянных паркетов, созданные 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)