如何在不设置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)