Я пытаюсь записать следующую таблицу с помощью 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.