如何通过C++ Apache Parquet向Parquet文件写入文件级元数据
可以通过C++ Arrow库实现Parquet文件级自定义元数据的存储,基于你参考的stream_reader_writer示例只需少量修改即可实现,具体操作如下:
1. 构造自定义元数据键值对
首先构造arrow::KeyValueMetadata对象,存储你需要的机器ID、机器名称等自定义字段:
// 初始化自定义元数据对象 auto custom_metadata = std::make_shared<arrow::KeyValueMetadata>(); // 添加自定义键值对 custom_metadata->Append("machine_id", "10001"); custom_metadata->Append("machine_name", "host-bj-prod-03");
2. 写入文件时传入元数据配置
在初始化Parquet写属性时,将构造好的自定义元数据传入WriterProperties:
// 构建Parquet写配置 parquet::WriterProperties::Builder prop_builder; // 注入自定义元数据 prop_builder.set_key_value_metadata(custom_metadata); std::shared_ptr<parquet::WriterProperties> write_props = prop_builder.build(); // 后续按原有逻辑创建ArrowFileWriter、写入数据即可,自定义元数据会自动写入Parquet文件Footer std::shared_ptr<parquet::arrow::FileWriter> file_writer; PARQUET_THROW_NOT_OK(parquet::arrow::FileWriter::Open(*schema, arrow::default_memory_pool(), output_stream, write_props, &file_writer)); // 原有写数据逻辑不变
3. 读取自定义元数据
读取Parquet文件时可以直接获取存储的自定义元数据:
// 打开Parquet文件 PARQUET_ASSIGN_OR_THROW(auto parquet_reader, parquet::ParquetFileReader::OpenFile("process_info.parquet")); // 获取文件级元数据 std::shared_ptr<const parquet::FileMetaData> file_meta = parquet_reader->metadata(); // 获取自定义键值元数据 std::shared_ptr<const arrow::KeyValueMetadata> kv_meta = file_meta->key_value_metadata(); if (kv_meta) { // 遍历读取所有自定义字段 for (int idx = 0; idx < kv_meta->size(); ++idx) { std::string key = kv_meta->key(idx); std::string value = kv_meta->value(idx); // 处理业务逻辑 } }
注意事项
- 键名建议增加业务前缀,避免和Parquet内置元数据键名冲突
- 所有自定义元数据的键值对均为字符串类型,如果需要存储数值、布尔等类型,需自行做类型转换
- 无需手动操作
parquet::FileMetaData类完成写入,该类主要用于读取场景,写入时通过写配置注入即可自动生成对应结构
内容的提问来源于stack exchange,提问作者globetrotter
相关产品推荐
相关产品推荐

