如何读取 Parquet 文件到熊猫数据框?

如何在不设置集群计算基础设施(如 Hadoop 或 Spark)的情况下,将中等规模的 Parquet 数据集读入内存熊猫数据框架?这只是我希望在笔记本电脑上使用简单的 Python 脚本在内存中读取的一小部分数据。数据不存在于 HDFS 中。它可能在本地文件系统上,也可能在 S3中。我不想旋转和配置其他服务,如 Hadoop、 Hive 或 Spark。

我认为 Blaze/Odo 可以做到这一点: Odo 文档提到了 Parquet,但是这些示例似乎都是通过外部 Hive 运行时完成的。

300441 次浏览

更新: 自从我回答这个问题以来,已经有很多关于 Apache Arrow 的工作,以便更好地读写镶木地板。还有: http://wesmckinney.com/blog/python-parquet-multithreading/

有一个蟒蛇拼花地板阅读器,工作相对较好: https://github.com/jcrobak/parquet-python

它将创建 python 对象,然后您必须将它们移动到 Panda DataFrame,因此这个过程将比 pd.read_csv慢,例如。

熊猫0.21介绍 Parquet 的新功能:

import pandas as pd
pd.read_parquet('example_pa.parquet', engine='pyarrow')

或者

import pandas as pd
pd.read_parquet('example_fp.parquet', engine='fastparquet')

以上连结解释:

这些引擎是非常相似的,应该读/写几乎相同的镶木格式的文件。这些库的不同之处在于具有不同的底层依赖关系(fastparquet 使用 numba,而 pyrow 使用 c 库)。

除了熊猫,Apache pyrow 还提供了将拼花地板转换为数据框架的方法

代码很简单,只要输入:

import pyarrow.parquet as pq


df = pq.read_table(source=your_file_path).to_pandas()

有关更多信息,请参见 Apache pyrow 读写单个文件中的文档

镶木文件总是大。所以阅读它使用黑暗。

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()

在拼花地板上书写时,可以考虑使用布罗特里压缩。我得到了一个70% 的大小减少8 GB 的文件实木地板文件使用布罗特利压缩。Brotli 比 gzip、 snappy 和 pickle 文件更小,读/写速度更快。虽然腌黄瓜可以做元宝石,而拼花地板不。

df.to_parquet('df.parquet.brotli',compression='brotli')
df = pd.read_parquet('df.parquet.brotli')

考虑名为 data.parquet.parquet文件

parquet_file = '../data.parquet'


open( parquet_file, 'w+' )

改用 Parquet

假设有一个数据帧 parquet_df,想要保存到上面的 parquet 文件中,可以使用 pandas.to_parquet(这个函数需要 快拼花地板或者 皮罗库) ,如下所示

parquet_df.to_parquet(parquet_file)

读 Parquet

为了将镶木地板文件读入数据帧 new_parquet_df,可以使用 pandas.read_parquet(),如下所示

new_parquet_df = pd.read_parquet(parquet_file)

镶木地板

步骤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')