如何将 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.html pd.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 数据帧保存到本地磁盘?

我可以通过索引访问 Parquet 文件而不将整个文件读入内存吗?

如何将 HDF5 文件转换为 Parquet 文件?

Pandas - 写实木复合地板并将列保持为十进制

如何将 S3 部分文件读入 pandas 数据框

如何将带有文本信息的 1.3 GB csv 文件读入 Python 的 pandas 对象?