如何将Parquet文件读取到Pandas DataFrame中



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

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

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

上面的链接解释道:

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

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

有一个python拼花地板阅读器运行相对良好:https://github.com/jcrobak/parquet-python

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

除了panda,Apache pyarrow还提供了将镶木地板转换为数据帧的方法

代码很简单,只需键入:

import pyarrow.parquet as pq
df = pq.read_table(source=your_file_path).to_pandas()

有关更多信息,请参阅Apache pyarrow Reading and Writing Single Files 的文档

镶木地板

步骤1:要玩的数据

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

步骤2:另存为镶木地板

df.to_parquet('sample.parquet')

3.阅读Parquet

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

在编写镶木地板时,请考虑使用brotli压缩。通过使用brotli压缩,我可以将8GB的镶木文件缩小70%。Brotli比gzip、snappy、pickle文件更小,读写速度更快。虽然泡菜可以做元组,而拼花地板不能。

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

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

考虑名为data.parquet.parquet文件

parquet_file = '../data.parquet'
open( parquet_file, 'w+' )

转换为镶木地板

假设有一个数据帧parquet_df要保存到上面的拼花地板文件中,则可以使用pandas.to_parquet(该函数需要fastparquet或pyarrow库),如下

parquet_df.to_parquet(parquet_file)

阅读Parquet

为了将拼花地板文件读取到数据帧new_parquet_df中,可以使用pandas.read_parquet(),如下

new_parquet_df = pd.read_parquet(parquet_file)

您可以使用python获取拼花地板数据

1.安装包pin 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)

最新更新