Считывание KeyValueMetadata из поля и схемы в pyarrow из файла, написанного на C

#parquet #pyarrow #apache-arrow

Вопрос:

Если я напишу простой файл паркета с помощью скрипта simple-write-parquet.cpp, Я ожидаю, что у меня будет простой файл для паркета с одним столбцом 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!
 

Есть ли способ извлечь данные из pyarrow KeyValueMetadata вложенных полей и схемы (например, с помощью WithMetadata методов) со стороны C , записав файлы Parquet на диск?

Ответ №1:

Похоже, что метаданные по умолчанию не сохраняются. Попробуйте включить store_schema в ArrowWriterProperties

 
void write_parquet_file(const arrow::Tableamp; 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 также добавляет некоторые метаданные, которые вам придется отфильтровать.

Комментарии:

1. Идеально, это делает именно то, что я хотел-спасибо 0x26res