Поддерживает ли какая-либо библиотека Python запись массивов структур в файлы Parquet?

Я хочу записать данные, в которых некоторые столбцы представляют собой массивы строк или массивы структур (обычно пары ключ-значение), в файл Parquet для использования в AWS Athena.

Найдя две библиотеки Python (Arrow и fastparquet), поддерживающие запись в файлы Parquet, я некоторое время боролся, пытаясь получить массивы структур.

Самый главный ответ на вопрос о написании файлов Parquet - перечислить эти две библиотеки (и упомянуть об отсутствии поддержки вложенных данных).

Так есть ли способ записать вложенные данные в файлы Parquet из Python?


Я попробовал следующее с помощью стрелки, чтобы сохранить ключи / значения.

import pyarrow as pa
import pyarrow.parquet as pq

countries = []
populations = []

countries.append('Sweden')
populations.append([{'city': 'Stockholm', 'population': 1515017}, {'city': 'Gothenburg', 'population': 590580}])
countries.append('Norway')
populations.append([{'city': 'Oslo', 'population': 958378}, {'city': 'Bergen', 'population': 254235}])


ty = pa.struct([pa.field('city', pa.string()),
                pa.field('population', pa.int32())
])

fields = [
    pa.field('country', pa.string()),
    pa.field('populations', pa.list_(ty)),
]
sch1 = pa.schema(fields)

data = [
    pa.array(countries),
    pa.array(populations, type=pa.list_(ty))
]
batch = pa.RecordBatch.from_arrays(data, ['f0', 'f1'])
table = pa.Table.from_batches([batch], sch1)
writer = pq.ParquetWriter('cities.parquet', sch1)
writer.write_table(table)
writer.close()

Когда я запустил код, я получил следующее сообщение:

Traceback (most recent call last):
  File "stackoverflow.py", line 30, in <module>
    writer.write_table(table)
  File "/Users/moonhouse/anaconda2/envs/parquet/lib/python3.6/site-packages/pyarrow/parquet.py", line 327, in write_table
    self.writer.write_table(table, row_group_size=row_group_size)
  File "_parquet.pyx", line 955, in pyarrow._parquet.ParquetWriter.write_table
  File "error.pxi", line 77, in pyarrow.lib.check_status
pyarrow.lib.ArrowInvalid: Nested column branch had multiple children

ответ в недавнем тикете Arrow JIRA с тем же сообщением об ошибке предполагает, что продолжается работа с поддерживающими структурами, хотя мне неясно, охватывает ли она запись или просто чтение.


Когда я пытался сохранить данные с помощью fastparquet (как здесь, когда у меня был список строк):

import pandas as pd
from fastparquet import write

data = [{  'cities': ['Stockholm', 'Copenhagen', 'Oslo', 'Helsinki']}]

df = pd.DataFrame(data)
write('test.parq', df, compression='SNAPPY')

сообщения об ошибке не было, но при просмотре в parquet-tools я заметил, что данные представляют собой JSON в кодировке Base64.

cities = WyJTdG9ja2hvbG0iLCAiQ29wZW5oYWdlbiIsICJPc2xvIiwgIkhlbHNpbmtpIl0=

Я полагаю, это ожидаемо, учитывая, что fastparquet не поддерживает массивы вложенных объектов.


person moonhouse    schedule 15.06.2018    source источник
comment
Эй, ты в конце концов понял это?   -  person Shadi    schedule 22.11.2019
comment
Нет, я не проверял текущий статус на предмет поддержки этого.   -  person moonhouse    schedule 22.11.2019


Ответы (1)


Решение

Вытягивание стрелки ›= 0.17.0 должно исправить вашу ошибку.

Ссылка

PR: https://github.com/apache/arrow/pull/6751

person pygeek    schedule 06.07.2020
comment
это исправило, @moonhouse? - person Mike Williamson; 06.08.2020