【问题标题】:How to store custom Parquet Dataset metadata with pyarrow?如何使用 pyarrow 存储自定义 Parquet 数据集元数据?
【发布时间】:2021-11-06 21:29:25
【问题描述】:

如何使用 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 文件(在 How to write Parquet metadata with pyarrow? 中概述)编写元数据的相同方法不适用于 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')

【问题讨论】:

  • 您可以将 Parquet 模式转换为 Arrow 模式 (dataset.schema.to_arrow_schema()),然后将其传递给 pq.write_metadata? Arrow 模式中设置的任何元数据都将保存在 Parquet FileMetaData 中。
  • @joris 谢谢,这确实很有帮助,但是,我认为我最初的问题有点误导。我现在更新了它,希望能更清楚地描述我的问题。

标签: python parquet pyarrow


【解决方案1】:

一种可能性(不直接回答问题)是使用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

【讨论】:

    猜你喜欢
    • 2019-02-06
    • 2020-03-08
    • 2017-01-08
    • 2021-09-16
    • 2020-07-30
    • 2016-08-07
    • 1970-01-01
    相关资源
    最近更新 更多