【问题标题】:Does any Python library support writing arrays of structs to Parquet files?是否有任何 Python 库支持将结构数组写入 Parquet 文件?
【发布时间】:2018-11-25 08:29:43
【问题描述】:

我想将某些列是字符串数组或结构数组(通常是键值对)的数据写入 Parquet 文件以在 AWS Athena 中使用。

在找到两个支持写入 Parquet 文件的 Python 库(Arrow 和 fastparquet)后,我一直在努力实现结构数组。

关于编写 Parquet 文件的问题的最佳答案列出了这两个库(并提到缺少对嵌套数据的支持)。

那么有没有办法从 Python 将嵌套数据写入 Parquet 文件?


我使用 Arrow 尝试了以下操作以存储键/值。

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

具有相同错误消息的answer in a recent Arrow JIRA ticket 表明正在进行支持结构的工作,尽管我不清楚它是否涵盖写入或仅读取这些结构。


当我尝试使用 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 中查看时,我注意到数据是 Base64 编码的 JSON。

cities = WyJTdG9ja2hvbG0iLCAiQ29wZW5oYWdlbiIsICJPc2xvIiwgIkhlbHNpbmtpIl0=

我猜这是意料之中的,因为fastparquet doesn't support nested object arrays。

【问题讨论】:

  • 嘿,你最终弄清楚了吗?
  • 不,我没有检查当前状态是否支持此功能。

标签: python parquet pyarrow fastparquet


【解决方案1】:

解决方案

拉箭头 >= 0.17.0 应该可以解决您的错误。

参考

公关:https://github.com/apache/arrow/pull/6751

【讨论】:

  • 这解决了吗,@moonhouse ?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-11
  • 2018-05-17
  • 1970-01-01
  • 2016-01-26
  • 2016-01-05
相关资源
最近更新 更多