如果我写一个简单的Parquet文件使用脚本simple-write-parque. cpp,我希望有一个简单的Parquet文件与一列MyInt
.脚本simple-write-parque.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!
有没有办法从pyarrow
中检索附加到字段和模式的KeyValueMetadata(例如通过WellMetadata
方法),从C端将Parquet文件写到磁盘?
看起来默认情况下没有保存元数据。尝试在ArrowWriterProperties
中打开store_schema
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'}
请注意,parquet还添加了一些您必须过滤掉的元数据。