如何将 Parquet 文件读入 Pandas DataFrame?
Posted
技术标签:
【中文标题】如何将 Parquet 文件读入 Pandas DataFrame?【英文标题】:How to read a Parquet file into Pandas DataFrame? 【发布时间】:2016-02-22 04:21:04 【问题描述】:如何在不设置集群计算基础架构(如 Hadoop 或 Spark)的情况下将中等大小的 Parquet 数据集读入内存中的 Pandas DataFrame?这只是我想在笔记本电脑上使用简单的 Python 脚本在内存中读取的适量数据。数据不驻留在 HDFS 上。它要么在本地文件系统上,要么在 S3 中。我不想启动和配置其他服务,例如 Hadoop、Hive 或 Spark。
我认为 Blaze/Odo 会让这成为可能:Odo 文档提到 Parquet,但这些示例似乎都通过外部 Hive 运行时进行。
【问题讨论】:
您是否碰巧公开了数据?我的 python-parquet 分支github.com/martindurant/parquet-python/tree/py3 在 parquet.rparquet 中有一个 pandas 阅读器,你可以试试。它无法处理许多镶木地板结构。 等待 Pandas 作者 Wes Mckinney 参与的 Apache Arrow 项目。 wesmckinney.com/blog/pandas-and-apache-arrow 完成后,用户应该可以直接从 Pandas 读取 Parquet 文件了。 由于问题已作为题外话关闭(但仍然是 Google 上的第一个结果),我必须在评论中回答。您现在可以使用 pyarrow 读取镶木地板文件并将其转换为熊猫数据框:import pyarrow.parquet as pq; df = pq.read_table('dataset.parq').to_pandas()
有点恼火这个问题被关闭了。 Spark 和 parquet 的文档(仍然)相对较差。我也在寻找这个问题的答案。
fastparquet 和 pyarrow 库都可以将 parquet 文件读入 pandas 数据帧:github.com/dask/fastparquet 和 arrow.apache.org/docs/python/parquet.html
【参考方案1】:
更新:自从我回答这个问题以来,已经在 Apache Arrow 上进行了大量工作,以便更好地读取和写入镶木地板。另外:http://wesmckinney.com/blog/python-parquet-multithreading/
有一个 python parquet reader 比较好用:https://github.com/jcrobak/parquet-python
它将创建 python 对象,然后您必须将它们移动到 Pandas DataFrame,因此该过程将比 pd.read_csv
慢。
【讨论】:
实际上有允许读/写的pyarrow:pyarrow.readthedocs.io/en/latest/parquet.html 当我尝试点击你的链接时,我收到一个权限被拒绝错误,@bluszcz -- 你有替代品吗? parquet-python 比 fastparquet et pyarrow 等替代方案慢得多:arrow.apache.org/docs/python/parquet.htmlpd.read_parquet
现在是 pandas 的一部分。另一个答案应标记为有效。【参考方案2】:
pandas 0.21 引入new functions for Parquet:
pd.read_parquet('example_pa.parquet', engine='pyarrow')
或
pd.read_parquet('example_fp.parquet', engine='fastparquet')
以上链接说明:
这些引擎非常相似,应该读/写几乎相同的 parquet 格式文件。这些库的不同之处在于具有不同的底层依赖项(fastparquet 使用 numba,而 pyarrow 使用 c 库)。
【讨论】:
对于我的大部分数据,“fastparquet”要快一些。以防pd.read_parquet()
返回 Snappy 错误问题,运行 conda install python-snappy
安装 snappy。
我发现 pyarrow 太难安装(在我的本地 windows 机器和云 linux 机器上)。即使在 python-snappy 修复之后,编译器也存在其他问题,并且错误模块“pyarrow”没有属性“compat”。 fastparquet 完全没有问题。
@Catbuilts 如果没有 snappy,可以使用 gzip。
'fastparquet' 可以读取 ',snappy.parquet' 文件吗?
我与@Seb 有相反的经历。 fastparquet 有很多问题,pyarrow 是简单的 pip 安装,然后我就走了【参考方案3】:
除了 pandas,Apache pyarrow 还提供了将 parquet 转换为数据帧的方法
代码很简单,只需输入:
import pyarrow.parquet as pq
df = pq.read_table(source=your_file_path).to_pandas()
有关更多信息,请参阅来自 Apache pyarrow Reading and Writing Single Files 的文档
【讨论】:
【参考方案4】:Parquet 文件总是很大。所以请使用 dask 阅读。
import dask.dataframe as dd
from dask import delayed
from fastparquet import ParquetFile
import glob
files = glob.glob('data/*.parquet')
@delayed
def load_chunk(path):
return ParquetFile(path).to_pandas()
df = dd.from_delayed([load_chunk(f) for f in files])
df.compute()
【讨论】:
【参考方案5】:写入 parquet 时,请考虑使用 brotli 压缩。通过使用 brotli 压缩,我将 8GB 文件 parquet 文件的大小减少了 70%。与 gzip、snappy、pickle 相比,Brotli 的文件更小,读/写速度更快。虽然 pickle 可以做元组,而 parquet 不能。
df.to_parquet('df.parquet.brotli',compression='brotli')
df = pd.read_parquet('df.parquet.brotli')
【讨论】:
【参考方案6】:考虑到名为data
的.parquet
文件
parquet_file = '../data.parquet'
open( parquet_file, 'w+' )
然后使用pandas.to_parquet
(此函数需要fastparquet 或pyarrow 库)
parquet_df.to_parquet(parquet_file)
然后,使用pandas.read_parquet()
获取数据帧
new_parquet_df = pd.read_parquet(parquet_file)
【讨论】:
【参考方案7】:镶木地板
第 1 步:要使用的数据
df = pd.DataFrame(
'student': ['personA007', 'personB', 'x', 'personD', 'personE'],
'marks': [20,10,22,21,22],
)
第 2 步:另存为 Parquet
df.to_parquet('sample.parquet')
第 3 步:从 Parquet 读取
df = pd.read_parquet('sample.parquet')
【讨论】:
以上是关于如何将 Parquet 文件读入 Pandas DataFrame?的主要内容,如果未能解决你的问题,请参考以下文章
Pandas - 如何将 Parquet 数据帧保存到本地磁盘?