Используйте схему со стрелками с parquet StreamWriter

#c #parquet #apache-arrow

#c #паркет #apache-стрелка

Вопрос:

Я пытаюсь использовать StreamWriter класс C , предоставляемый Apache Arrow.

Единственный пример использования 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));

  

Конечным результатом является a std::shared_ptr<parquet::schema::GroupNode> , в который затем можно передать StreamWriter .

Можно ли создавать и использовать «высокоуровневые» схемы стрелок с StreamWriter помощью? Они поддерживаются при использовании WriteTable функции (не потоковой передачи), но я не нашел примеров ее использования с потоковым API.

Я, конечно, могу прибегнуть к использованию низкоуровневого API, но он чрезвычайно многословен при создании большой и сложной схемы, и я бы предпочел (но не нужно) использовать высокоуровневые механизмы схемы стрелок.

Например,

 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, amp;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);

  

Последняя строка завершается ошибкой, потому parquet_schema->group_node() что (это единственный известный мне способ получить доступ к GroupNode для схемы) возвращает a const GroupNode* , тогда ParquetFileWriter::Open) как требуется a std::shared_ptr<GroupNode> .

Я не уверен, что удаление константы возвращаемого узла группы и принудительное включение его в ::Open() вызов является официально поддерживаемым (или правильным) использованием StreamWriter .

Возможно ли то, что я хочу сделать?

Ответ №1:

Похоже, вам нужно использовать низкоуровневый api для StreamWriter.

очень сложный способ:

 auto writer = parquet::ParquetFileWriter::Open(outfile_, std::shared_ptr<parquet::schema::GroupNode>(const_cast<parquet::schema::GroupNode *>(parquet_schema->group_node())), properties);
  

возможно, вам потребуется преобразовать схему вручную.

исходный код cpp/src/parquet/arrow/schema.cc может вам помочь.

 PARQUET_EXPORT
::arrow::Status ToParquetSchema(const ::arrow::Schema* arrow_schema,
                                const WriterPropertiesamp; properties,
                                std::shared_ptr<SchemaDescriptor>* out);