Rem*_*elt 5 c++ parquet apache-arrow
我正在尝试使用StreamWriter
Apache Arrow 提供的 C++ 类。
唯一的使用示例StreamWriter
使用低级 Parquet API,即
parquet::schema::NodeVector fields;
fields.push_back(parquet::schema::PrimitiveNode::Make(
"string_field", parquet::Repetition::OPTIONAL, parquet::Type::BYTE_ARRAY,
parquet::ConvertedType::UTF8));
fields.push_back(parquet::schema::PrimitiveNode::Make(
"char_field", parquet::Repetition::REQUIRED, parquet::Type::FIXED_LEN_BYTE_ARRAY,
parquet::ConvertedType::NONE, 1));
auto node = std::static_pointer_cast<parquet::schema::GroupNode>(
parquet::schema::GroupNode::Make("schema", parquet::Repetition::REQUIRED, fields));
Run Code Online (Sandbox Code Playgroud)
最终结果是 a std::shared_ptr<parquet::schema::GroupNode>
,然后可以将其传递到StreamWriter
.
是否可以构建和使用“高级”箭头模式StreamWriter
?使用该函数(非流式传输)时支持它们WriteTable
,但我没有发现它与流式 API 一起使用的示例。
当然,我可以求助于使用低级 API,但在创建大型且复杂的模式时它非常冗长,我更喜欢(但不需要)使用高级 Arrow 模式机制。
例如,
std::shared_ptr<arrow::io::FileOutputStream> outfile_;
PARQUET_ASSIGN_OR_THROW(outfile_, arrow::io::FileOutputStream::Open("test.parquet"));
// construct an arrow schema
auto schema = arrow::schema({arrow::field("field1", arrow::int64()),
arrow::field("field2", arrow::float64()),
arrow::field("field3", arrow::float64())});
// build the writer properties
parquet::WriterProperties::Builder builder;
auto properties = builder.build()
// my current best attempt at converting the Arrow schema to a Parquet schema
std::shared_ptr<parquet::SchemaDescriptor> parquet_schema;
parquet::arrow::ToParquetSchema(schema.get(), *properties, &parquet_schema); // parquet_schema is now populated
// and now I try and build the writer - this fails
auto writer = parquet::ParquetFileWriter::Open(outfile_, parquet_schema->group_node(), properties);
Run Code Online (Sandbox Code Playgroud)
最后一行失败,因为parquet_schema->group_node()
(这是我知道访问模式的唯一方法GroupNode
)返回 aconst GroupNode*
而ParquetFileWriter::Open)
需要 a std::shared_ptr<GroupNode>
。
我不确定放弃返回的组节点的常量并强制其进入调用::Open()
是否是官方支持的(或正确的)用法StreamWriter
。
我想做的事情可能吗?
看来您需要为 StreamWriter 使用低级 api。
一个非常棘手的方法:
auto writer = parquet::ParquetFileWriter::Open(outfile_, std::shared_ptr<parquet::schema::GroupNode>(const_cast<parquet::schema::GroupNode *>(parquet_schema->group_node())), properties);
Run Code Online (Sandbox Code Playgroud)
您可能需要手动转换模式。
源代码 cpp/src/parquet/arrow/schema.cc
可能对你有帮助。
PARQUET_EXPORT
::arrow::Status ToParquetSchema(const ::arrow::Schema* arrow_schema,
const WriterProperties& properties,
std::shared_ptr<SchemaDescriptor>* out);
Run Code Online (Sandbox Code Playgroud)