#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