首页 > 解决方案 > 从用 C++ 编写的文件中读取来自 pyarrow 中的字段和模式的 KeyValueMetadata

问题描述

如果我使用脚本simple-write-parquet.cpp编写一个简单的 Parquet 文件,我希望有一个带有单列的简单 Parquet 文件MyInt。脚本simple-write-parquet.cpp尝试使用一些虚拟值添加KeyValueMetadata到字段中。MyInt在 C++ 代码中,如果我这样做,

std::cout << field->ToString(true) << std::endl;

我看到了预期的回报。

...
-- metadata --
foo: bar
bar: foo

我希望这个元数据将保留在输出 Parquet 文件中。

但是,当我尝试使用 读取此文件时pyarrow,此字段元数据键值对似乎不存在:

import pyarrow as pa
import pyarrow.parquet as pq

table = pq.read_table("test.parquet")
field = table.field("MyInt")
field.metadata # None!

有没有办法从 C++ 端将 Parquet 文件写入磁盘pyarrowKeyValueMetadata附加字段和模式(例如通过方法)中检索?WithMetadata

标签: parquetpyarrowapache-arrow

解决方案


默认情况下,元数据似乎未保存。尝试在store_schema打开ArrowWriterProperties


void write_parquet_file(const arrow::Table& table)
{
    std::shared_ptr<arrow::io::FileOutputStream> outfile;
    PARQUET_ASSIGN_OR_THROW(outfile, arrow::io::FileOutputStream::Open("test.parquet"));
    PARQUET_THROW_NOT_OK(parquet::arrow::WriteTable(
        table,
        arrow::default_memory_pool(),
        outfile,
        3,
        parquet::default_writer_properties(),
        parquet::ArrowWriterProperties::Builder().store_schema()->build()));
}

它应该工作:

>>> table.field('MyInt').metadata
{b'PARQUET:field_id': b'1', b'bar': b'foo', b'foo': b'bar'}

请注意,镶木地板还添加了一些您必须过滤掉的元数据。


推荐阅读