如何将 Parquet 文件读入 Pandas DataFrame?

How to read a Parquet file into Pandas DataFrame?

如何在不设置 Hadoop 或 Spark 等集群计算基础架构的情况下将中等大小的 Parquet 数据集读入内存中 Pandas DataFrame?这只是我想在笔记本电脑上使用简单的 Python 脚本读取内存中的少量数据。数据不驻留在 HDFS 上。它要么在本地文件系统上,要么可能在 S3 中。我不想启动和配置其他服务,例如 Hadoop、Hive 或 Spark。

我认为 Blaze/Odo 会让这成为可能:Odo 文档提到了 Parquet,但这些示例似乎都是通过外部 Hive 运行时进行的。

更新:自从我回答这个问题以来,为了更好地读写镶木地板,Apache Arrow 已经做了很多工作。另外:http://wesmckinney.com/blog/python-parquet-multithreading/

有一个 python 实木复合地板 reader 效果相对较好:https://github.com/jcrobak/parquet-python

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

pandas 0.21 介绍 new functions for 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')

以上link说明:

These engines are very similar and should read/write nearly identical parquet format files. These libraries differ by having different underlying dependencies (fastparquet by using numba, while pyarrow uses a c-library).

除了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

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

写入 parquet 时,请考虑使用 brotli 压缩。通过使用 brotli 压缩,我将 8GB 文件镶木地板文件的大小减少了 70%。 Brotli 比 gzip、snappy、pickle 文件更小,速度更快 read/writes。尽管 pickle 可以做元组而 parquet 不能。

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

正在考虑名为 data

.parquet 文件
parquet_file = '../data.parquet'

open( parquet_file, 'w+' )

然后使用pandas.to_parquet (this function requires either the fastparquet or pyarrow库)

parquet_df.to_parquet(parquet_file)

然后,使用pandas.read_parquet()得到一个dataframe

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