moo*_*use 6 python parquet fastparquet pyarrow
我想将其中某些列是字符串数组或结构数组(通常是键值对)的数据写入Parquet文件中,以便在AWS Athena中使用。
找到两个Python库(Arrow和fastparquet)以支持对Parquet文件的写入之后,我努力尝试了一段时间以获取结构数组。
编写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()
Run Code Online (Sandbox Code Playgroud)
运行代码时,我收到以下消息:
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
Run Code Online (Sandbox Code Playgroud)
在最近的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')
Run Code Online (Sandbox Code Playgroud)
没有给出错误消息,但是在镶木地板工具中查看时,我注意到数据是Base64编码的JSON。
cities = WyJTdG9ja2hvbG0iLCAiQ29wZW5oYWdlbiIsICJPc2xvIiwgIkhlbHNpbmtpIl0=
Run Code Online (Sandbox Code Playgroud)
我想这是可以预期的,因为fastparquet不支持嵌套对象数组。
拉动箭头 >= 0.17.0 应该可以修复您的错误。
公关: https: //github.com/apache/arrow/pull/6751
| 归档时间: |
|
| 查看次数: |
1317 次 |
| 最近记录: |