Запись в таблицу Pyarrow с двумя глубинными структурными схемами повышает "Вложенная ветвь столбца имела несколько дочерних элементов" - PullRequest
1 голос
/ 25 марта 2020

Я пытаюсь записать следующую таблицу с помощью pyarrow в файле партера:

In [61]: values = [{"field_a": {"square": i**2, "cube": i**3}, "field_b": {"foo": "bar"}} for i in range(10)]

In [62]: somedf = pd.DataFrame({"calculations": values})

In [63]: somedf
Out[63]:
                                        calculations
0  {'field_a': {'square': 0, 'cube': 0}, 'field_b...
1  {'field_a': {'square': 1, 'cube': 1}, 'field_b...
2  {'field_a': {'square': 4, 'cube': 8}, 'field_b...
3  {'field_a': {'square': 9, 'cube': 27}, 'field_...
4  {'field_a': {'square': 16, 'cube': 64}, 'field...
5  {'field_a': {'square': 25, 'cube': 125}, 'fiel...
6  {'field_a': {'square': 36, 'cube': 216}, 'fiel...
7  {'field_a': {'square': 49, 'cube': 343}, 'fiel...
8  {'field_a': {'square': 64, 'cube': 512}, 'fiel...
9  {'field_a': {'square': 81, 'cube': 729}, 'fiel...

Я хочу сохранить один столбец с некоторой структурированной информацией внутри. Но когда я пытаюсь сохранить его с помощью write_table, я получаю вложенную ветвь столбца с множественной дочерней ошибкой.

In [64]: t = pa.Table.from_pandas(somedf)

In [65]: t
Out[65]:
pyarrow.Table
calculations: struct<field_a: struct<cube: int64, square: int64>, field_b: struct<foo: string>>
  child 0, field_a: struct<cube: int64, square: int64>
      child 0, cube: int64
      child 1, square: int64
  child 1, field_b: struct<foo: string>
      child 0, foo: string
metadata
--------
{b'pandas': b'{"index_columns": [{"kind": "range", "name": null, "start": 0, "'
            b'stop": 10, "step": 1}], "column_indexes": [{"name": null, "field'
            b'_name": null, "pandas_type": "unicode", "numpy_type": "object", '
            b'"metadata": {"encoding": "UTF-8"}}], "columns": [{"name": "calcu'
            b'lations", "field_name": "calculations", "pandas_type": "object",'
            b' "numpy_type": "object", "metadata": null}], "creator": {"librar'
            b'y": "pyarrow", "version": "0.15.1"}, "pandas_version": "1.0.1"}'}

In [66]: pq.write_table(t, where="somefile.parquet")
---------------------------------------------------------------------------
ArrowInvalid                              Traceback (most recent call last)
<ipython-input-66-574729027bcf> in <module>
----> 1 pq.write_table(t, where="somefile.parquet")

~/anaconda3/lib/python3.7/site-packages/pyarrow/parquet.py in write_table(table, where, row_group_size, version, use_dictionary, compression, write_statistics, use_deprecated_int96_timestamps, coerce_timestamps, allow_truncated_timestamps, data_page_size, flavor, filesystem, compression_level, **kwargs)
   1342                 compression_level=compression_level,
   1343                 **kwargs) as writer:
-> 1344             writer.write_table(table, row_group_size=row_group_size)
   1345     except Exception:
   1346         if _is_path_like(where):

~/anaconda3/lib/python3.7/site-packages/pyarrow/parquet.py in write_table(self, table, row_group_size)
    472             raise ValueError(msg)
    473
--> 474         self.writer.write_table(table, row_group_size=row_group_size)
    475
    476     def close(self):

~/anaconda3/lib/python3.7/site-packages/pyarrow/_parquet.pyx in pyarrow._parquet.ParquetWriter.write_table()

~/anaconda3/lib/python3.7/site-packages/pyarrow/error.pxi in pyarrow.lib.check_status()

ArrowInvalid: Nested column branch had multiple children: struct<field_a: struct<cube: int64, square: int64>, field_b: struct<foo: string>>

Преобразование таблицы проходит хорошо, но когда я пытаюсь сохранить его, эта ошибка появляется. Возможно ли это сделать? Если это так, это ошибка? Я немного растерялся, как справиться с этим.

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

Как описано в метаданных, я использую pyarrow 0.15.1 и pandas 1.0.1.

...