如何使用pyarrow存储自定义Parquet数据集元数据?

7
我怎样使用pyarrow将自定义元数据存储到ParquetDataset中呢? 例如,如果我使用Dask创建一个Parquet数据集。
import dask
dask.datasets.timeseries().to_parquet('temp.parq')

我可以使用pyarrow读取它

import pyarrow.parquet as pq
dataset = pq.ParquetDataset('temp.parq')

然而,我想要使用的书写单个Parquet文件元数据的方法(在如何使用pyarrow编写Parquet元数据?中概述)并不适用于ParquetDataset,因为没有replace_schema_metadata函数或类似函数。

我认为我可能想要编写一个自定义的_custom_metadata文件,因为我想存储整个数据集的元数据。我认为该过程与以下过程类似:

meta = pq.read_metadata('temp.parq/_common_metadata')
custom_metadata = { b'type': b'mydataset' }
merged_metadata = { **custom_metadata, **meta.metadata }
# TODO: Construct FileMetaData object with merged_metadata
new_meta.write_metadata_file('temp.parq/_common_metadata')

1
您可以将Parquet模式转换为Arrow模式(dataset.schema.to_arrow_schema()),并将其传递给pq.write_metadata。在Arrow模式中设置的任何元数据都将保留在Parquet FileMetaData中。 - joris
@joris 谢谢,那确实有帮助,但我认为我的原始问题有点误导。我现在已经更新了它,并附上了一个更清晰的描述我的问题的说明。 - Dahn
1个回答

2

一个可能的解决方案(并非直接回答问题)是使用Dask

import dask

# Sample data
df = dask.datasets.timeseries()

df.to_parquet('test.parq', custom_metadata={'mymeta': 'myvalue'})

Dask通过向目录中的所有文件(包括_common_metadata_metadata)写入元数据来实现此功能。
from pathlib import Path
import pyarrow.parquet as pq

files = Path('test.parq').glob('*')

all([b'mymeta' in pq.ParquetFile(file).metadata.metadata for file in files])
# True

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接