108

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

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

4

7 回答 7

129

pandas 0.21为 Parquet 引入了新功能

pd.read_parquet('example_pa.parquet', engine='pyarrow')

或者

pd.read_parquet('example_fp.parquet', engine='fastparquet')

上面的链接说明:

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

于 2017-10-31T13:12:54.947 回答
20

更新:自从我回答这个问题以来,已经有很多关于 Apache Arrow 的工作,以便更好地读取和写入镶木地板。另外:http ://wesmckinney.com/blog/python-parquet-multithreading/

有一个 python parquet reader 比较好用:https ://github.com/jcrobak/parquet-python

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

于 2015-11-19T20:46:29.577 回答
11

除了 pandas,Apache pyarrow 还提供了将 parquet 转换为 dataframe 的方法

代码很简单,只需输入:

import pyarrow.parquet as pq

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

有关更多信息,请参阅 Apache pyarrow阅读和编写单个文件的文档

于 2019-12-28T10:04:30.530 回答
6

镶木地板

第 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')
于 2021-08-26T07:27:10.903 回答
1

写入 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')
于 2021-05-08T08:24:56.880 回答
1

考虑.parquet文件名为data

parquet_file = '../data.parquet'

open( parquet_file, 'w+' )

然后使用pandas.to_parquet(此功能需要fastparquetpyarrow库)

parquet_df.to_parquet(parquet_file)

然后,用于pandas.read_parquet()获取数据框

new_parquet_df = pd.read_parquet(parquet_file)
于 2021-05-14T15:14:31.623 回答
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()
于 2021-04-27T10:30:07.633 回答