如何使用Pandas编写分区Parquet文件

11
我试图将一个Pandas数据框写入到分区文件中:
df.to_parquet('output.parquet', engine='pyarrow', partition_cols = ['partone', 'partwo'])

TypeError: __cinit__() got an unexpected keyword argument 'partition_cols'

从文档中我期望partition_cols将传递为pyarrow库的kwargs。如何使用pandas将分区文件写入本地磁盘?


你确定 partitiol_cols 参数中没有打错字吗? - sophros
是的,这不是问题。请注意错误消息是正确的。 - Ivan
2
partition_cols 已经在 pandas 0.24.0 中添加:https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.to_parquet.html - Giorgio Balestrieri
3个回答

22

首先确保你已经安装了相对较新的 pandas 和 pyarrow 版本:

pyenv shell 3.8.2
python -m venv venv
source venv/bin/activate
pip install pandas pyarrow
pip freeze | grep pandas # pandas==1.2.3
pip freeze | grep pyarrow # pyarrow==3.0.0

然后您可以使用 partition_cols 来生成分区parquet文件:

import pandas as pd

# example dataframe with 3 rows and columns year,month,day,value
df = pd.DataFrame(data={'year':  [2020, 2020, 2021],
                        'month': [1,12,2], 
                        'day':   [1,31,28], 
                        'value': [1000,2000,3000]})

df.to_parquet('./mydf', partition_cols=['year', 'month', 'day'])

这会生成:

mydf/year=2020/month=1/day=1/6f0258e6c48a48dbb56cae0494adf659.parquet
mydf/year=2020/month=12/day=31/cf8a45116d8441668c3a397b816cd5f3.parquet
mydf/year=2021/month=2/day=28/7f9ba3f37cb9417a8689290d3f5f9e6e.parquet

17

Pandas的DataFrame.to_parquet只是一个对table = pa.Table.from_pandas(...)pq.write_table(table, ...)进行了轻量级封装的函数(参见pandas.parquet.py#L120),而pq.write_table不支持写入分区数据集。您应该改用pq.write_to_dataset

import pandas as pd
import pyarrow as pa
import pyarrow.parquet as pq

df = pd.DataFrame(yourData)
table = pa.Table.from_pandas(df)

pq.write_to_dataset(
    table,
    root_path='output.parquet',
    partition_cols=['partone', 'parttwo'],
)

有关更多信息,请参见pyarrow文档.

总的来说,当读取或写入parquet文件时,我通常会直接使用PyArrow API,因为Pandas封装程序在其功能上受到了一定的限制。


我相信我使用了 engine=pyarrow 选项,而默认引擎似乎是 pyarrow 而不是 fastparquet:“engine : {‘auto’, ‘pyarrow’, ‘fastparquet’}, default ‘auto’Parquet 库的使用。如果是 ‘auto’,则使用 io.parquet.engine 选项。默认的 io.parquet.engine 行为是尝试使用 ‘pyarrow’,如果 ‘pyarrow’ 不可用,则回退到 ‘fastparquet’。” https://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.to_parquet.html - Ivan
是的,你说得对。他们一定在最近的版本中更改了它。 - ostrokach
1
最近的 pandas 已经整合了 partitioned_cols 并开始使用 write_to_dataset - stucash

9

您需要更新到Pandas 0.24或更高版本。从该版本开始,partition_cols功能已经添加。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接