如何在不设置Hadoop或Spark等集群计算基础架构的情况下,将适当大小的Parquet数据集读入内存中的Pandas DataFrame?这只是我想在笔记本电脑上用简单的Python脚本在内存中读取的适量数据。数据不驻留在HDFS上。它可以在本地文件系统上,也可以在S3中。我不想启动和配置其他服务,如Hadoop,Hive或Spark。
我认为Blaze / Odo会让这成为可能:Odo文档提到了Parquet,但是这些示例似乎都是通过外部Hive运行时进行的。
答案 0 :(得分:47)
pandas 0.21介绍new functions for Parquet:
pd.read_parquet('example_pa.parquet', engine='pyarrow')
或
pd.read_parquet('example_fp.parquet', engine='fastparquet')
以上链接说明:
这些引擎非常相似,应该读/写几乎相同的镶木地板格式文件。这些库的不同之处在于具有不同的底层依赖关系(fastparquet使用numba,而pyarrow使用c-library)。
答案 1 :(得分:16)
更新:自从我回答这个问题以来,为了更好地阅读和编写实木复合地板,我们已经做了很多关于Apache Arrow的工作。另外:http://wesmckinney.com/blog/python-parquet-multithreading/
有一个python镶木地板阅读器相对运行良好:https://github.com/jcrobak/parquet-python
它将创建python对象,然后您必须将它们移动到Pandas DataFrame,因此该过程将比pd.read_csv
慢。
答案 2 :(得分:0)
除了熊猫,Apache pyarrow还提供了将拼花地板转换为数据框的方法
代码很简单,只需键入:
import pyarrow.parquet as pq
df = pq.read_table(source=your_file_path).to_pandas()
有关更多信息,请参阅Apache pyarrow Reading and Writing Single Files
中的文档。答案 3 :(得分:0)
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()
答案 4 :(得分:0)
写入 parquet 时,请考虑使用 brotli 压缩。通过使用 brotli 压缩,我将 8GB 文件镶木地板文件的大小减少了 70%。与 gzip、snappy、pickle 相比,Brotli 使文件更小,读/写速度更快。虽然pickle可以做元组而parquet不能。
df.to_parquet('df.parquet.brotli',compression='brotli')
df = pd.read_parquet('df.parquet.brotli')
答案 5 :(得分:0)
考虑名为 .parquet
的 data
文件
parquet_file = '../data.parquet'
open( parquet_file, 'w+' )
然后使用 pandas.to_parquet
(此函数需要 fastparquet 或 pyarrow 库)
parquet_df.to_parquet(parquet_file)
然后,使用 pandas.read_parquet()
获取数据帧
new_parquet_df = pd.read_parquet(parquet_file)