Запись типа данных паркетной КАРТЫ с помощью PyArrow

#python #pyarrow #apache-arrow

#python #pyarrow #apache-стрелка

Вопрос:

Я пишу на Python и хотел бы использовать PyArrow для создания файлов Parquet.

Согласно моему пониманию и состоянию реализации, библиотека C (Python) уже реализовала тип КАРТЫ. Из типов данных я также могу найти тип map_(key_type, item_type[, keys_sorted]) .

Итак, я протестировал несколько разных подходов в Python / PyArrow. Но все они потерпели неудачу.

Например.:

 df = pd.DataFrame({
        'col1': pd.Series([
            [('key', 'aaaa'), ('value', '1111')],
            [('key', 'bbbb'), ('value', '2222')],
        ]),
        'col2': pd.Series(['foo', 'bar'])
    }
)

udt = pa.map_(pa.string(), pa.string())
schema = pa.schema([pa.field('col1', udt), pa.field('col2', pa.string())])

table = pa.Table.from_pandas(df, schema)
pq.write_table(table, FILE_NAME)
  

Когда я прочитал файл с parquet-tools cat rand_gen_test_map.parquet помощью, я получил:

 col1:
.key_value:
.key_value:
col2 = foo

col1:
.key_value:
.key_value:
col2 = bar
  

Мне кажется, что значения карты выводятся неправильно (или пропущены). Хотя схема правильная:

 message schema {
  optional group col1 (MAP) {
    repeated group key_value {
      required binary key (UTF8);
      optional binary value (UTF8);
    }
  }
  optional binary col2 (UTF8);
}
  

В целом, у меня есть два вопроса (все на Python):

  1. каков наилучший способ создания файлов Parquet с типом данных КАРТЫ (если будет здорово, если пример может быть прикреплен)

  2. Я понимаю, что мы можем использовать a STRUCT для имитации структуры карты. Но поскольку Parquet предоставил тип карты, мы все равно хотим его использовать. Если тип данных КАРТЫ не может быть сгенерирован, в чем причина предоставления типа КАРТЫ?

Ответ №1:

Произошла ошибка при написании типов карт. Это должно быть исправлено в pyarrow 2.0 (также чтение теперь поддерживается изначально)

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

1. спасибо @micah-kornfield, новая версия действительно решила проблему для меня. очень признателен!

2. обратите внимание, что в версии 2.0 также были некоторые ошибки, к сожалению, в версии 3.0, надеюсь, они все исправлены.