parquet - 从用 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 文件写入磁盘pyarrow
的KeyValueMetadata
附加字段和模式(例如通过方法)中检索?WithMetadata
解决方案
默认情况下,元数据似乎未保存。尝试在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'}
请注意,镶木地板还添加了一些您必须过滤掉的元数据。
推荐阅读
- python - 如何从 DialogFlow 事件中获取参数
- node.js - 仅将结果作为值数组返回
- reactjs - 反应路由器错误,实现匹配接口
- angular - 角度 5 中具有相同 URL 的两个不同组件(通过延迟加载在路由器中传递 slug)
- complex-event-processing - CEP 列表作为单个项目(迭代托管对象)
- node.js - 如何在环回中获取标头值
- python - 二维列表中的嵌套迭代
- jquery - 使用 $(window).scroll(function() 时事件未绑定在 ajax 加载的内容上
- html - 使用 div 分割 HTML 页面
- java - java.io.IOException