如何将Parquet文件读入Pandas DataFrame?

166
如何在没有设置像Hadoop或Spark这样的集群计算基础设施的情况下,将一个适度大小的Parquet数据集读入内存的Pandas DataFrame? 我想用一台笔记本电脑上的简单Python脚本将数据读入内存。 数据不驻留在HDFS上。 它可能位于本地文件系统或S3中。 我不想启动和配置其他服务,如Hadoop,Hive或Spark。
我认为Blaze / Odo可以实现这一点:Odo文档提到了Parquet,但示例似乎都通过外部Hive运行时进行操作。

3
您是否有数据公开可用?我的 python-parquet 分支 https://github.com/martindurant/parquet-python/tree/py3 中有一个 pandas 读取器在 parquet.rparquet 中,您可以尝试使用它。它无法处理许多 Parquet 构造。 - mdurant
4
请等待Pandas作者Wes Mckinney参与的Apache Arrow项目。完成后,用户应该能够直接从Pandas读取Parquet文件。 - XValidated
4
由于这个问题已被关闭为不适当的话题(但仍然是谷歌的第一个结果),我必须在评论中回答。您现在可以使用pyarrow读取parquet文件并将其转换为pandas DataFrame:import pyarrow.parquet as pq; df = pq.read_table('dataset.parq').to_pandas() - sroecker
4
有点烦这个问题被关闭了。 Spark和Parquet文档相对较少。我也在寻找答案。 - user48956
2
快速parquet和pyarrow库都可以将parquet文件读入pandas dataframe中:https://github.com/dask/fastparquet 和 https://arrow.apache.org/docs/python/parquet.html - ogrisel
显示剩余3条评论
8个回答

210

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

上面的链接解释了:
这些引擎非常相似,应该读/写几乎相同的parquet格式文件。这些库之间的区别在于具有不同的底层依赖项(fastparquet使用numba,而pyarrow使用c库)。

17
对于我的大部分数据,“fastparquet”速度稍快。如果 pd.read_parquet() 返回 Snappy 错误问题,请运行 conda install python-snappy 安装 Snappy。 - Chau Pham
1
我发现在本地的Windows机器和云Linux机器上安装pyarrow太困难了。即使在修复python-snappy后,编译器仍然存在其他问题,以及错误模块“pyarrow”没有属性“compat”。fastparquet则没有任何问题。 - Seb
1
@Catbuilts 如果你没有 snappy,你可以使用 gzip。 - Khan
'fastparquet' 能读取 '.snappy.parquet' 文件吗? - wawawa
3
我和@Seb的经历恰恰相反。fastparquet存在很多问题,而pyarrow只需要简单的pip安装就可以使用了。 - Mark Z.

20

10
实际上有 PyArrow 可以进行读写操作:http://pyarrow.readthedocs.io/en/latest/parquet.html - bluszcz
当我尝试跟随您的链接@bluszcz时,出现了权限被拒绝的错误,您有其他备选链接吗? - snooze_bear
1
parquet-python比诸如fastparquet和pyarrow等替代方案要慢得多:https://arrow.apache.org/docs/python/parquet.html - ogrisel
1
pd.read_parquet现在是pandas的一部分。另一个答案应该被标记为有效。 - ogrisel

15
除了pandas之外,Apache pyarrow也提供将parquet转换为数据帧的方法。
代码很简单,只需输入:
import pyarrow.parquet as pq

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

更多信息请查看Apache pyarrow文档 读写单个文件


12

Parquet

步骤1:可用于操作的数据

df = pd.DataFrame({
    'student': ['personA007', 'personB', 'x', 'personD', 'personE'],
    'marks': [20,10,22,21,22],
})

步骤2:保存为Parquet

df.to_parquet('sample.parquet')

步骤三:从Parquet文件中读取

df = pd.read_parquet('sample.parquet')

4

在编写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')

2

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

1
考虑名为 data.parquet.parquet 文件。
parquet_file = '../data.parquet'

open( parquet_file, 'w+' )

转换为Parquet格式

假设有一个数据框 parquet_df,想要将其保存到上述的Parquet文件中,可以使用 pandas.to_parquet 函数(此函数需要 fastparquetpyarrow 库),如下所示:

parquet_df.to_parquet(parquet_file)

从Parquet读取

为了将Parquet文件读入到名为new_parquet_df的数据框中,可以使用pandas.read_parquet()函数,如下所示:

new_parquet_df = pd.read_parquet(parquet_file)

0

你可以使用Python获取Parquet数据

1.安装包 pip install pandas pyarrow

2.读取文件

def read_parquet(file):
    result = []
    data = pd.read_parquet(file)
    for index in data.index:
        res = data.loc[index].values[0:-1]
        result.append(res)
    print(len(result))


file = "./data.parquet"
read_parquet(file)

这是“pip install”,而不是“pin install”。我本来可以修正它,但是尽管只有一个字母的改变就能让程序无法运行并引发很多混乱,但是不允许进行小的更改。 - Roobie Nuby

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