如何将 Parquet 文件读入 Pandas DataFrame?
How to read a Parquet file into Pandas DataFrame?
如何在不设置 Hadoop 或 Spark 等集群计算基础架构的情况下将中等大小的 Parquet 数据集读入内存中 Pandas DataFrame?这只是我想在笔记本电脑上使用简单的 Python 脚本读取内存中的少量数据。数据不驻留在 HDFS 上。它要么在本地文件系统上,要么可能在 S3 中。我不想启动和配置其他服务,例如 Hadoop、Hive 或 Spark。
我认为 Blaze/Odo 会让这成为可能:Odo 文档提到了 Parquet,但这些示例似乎都是通过外部 Hive 运行时进行的。
更新:自从我回答这个问题以来,为了更好地读写镶木地板,Apache Arrow 已经做了很多工作。另外:http://wesmckinney.com/blog/python-parquet-multithreading/
有一个 python 实木复合地板 reader 效果相对较好:https://github.com/jcrobak/parquet-python
它将创建 python 个对象,然后您必须将它们移动到 Pandas DataFrame,因此该过程将比 pd.read_csv
慢。
pandas 0.21 介绍 new functions for 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')
以上link说明:
These engines are very similar and should read/write nearly identical parquet format files. These libraries differ by having different underlying dependencies (fastparquet by using numba, while pyarrow uses a c-library).
除了pandas,Apache pyarrow 还提供了将 parquet 转换为数据帧的方法
代码很简单,直接输入:
import pyarrow.parquet as pq
df = pq.read_table(source=your_file_path).to_pandas()
有关详细信息,请参阅 Apache pyarrow 中的文档 Reading and Writing Single Files
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()
写入 parquet 时,请考虑使用 brotli 压缩。通过使用 brotli 压缩,我将 8GB 文件镶木地板文件的大小减少了 70%。 Brotli 比 gzip、snappy、pickle 文件更小,速度更快 read/writes。尽管 pickle 可以做元组而 parquet 不能。
df.to_parquet('df.parquet.brotli',compression='brotli')
df = pd.read_parquet('df.parquet.brotli')
正在考虑名为 data
的 .parquet
文件
parquet_file = '../data.parquet'
open( parquet_file, 'w+' )
然后使用pandas.to_parquet
(this function requires either the fastparquet or pyarrow库)
parquet_df.to_parquet(parquet_file)
然后,使用pandas.read_parquet()
得到一个dataframe
new_parquet_df = pd.read_parquet(parquet_file)
镶木地板
第 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')
如何在不设置 Hadoop 或 Spark 等集群计算基础架构的情况下将中等大小的 Parquet 数据集读入内存中 Pandas DataFrame?这只是我想在笔记本电脑上使用简单的 Python 脚本读取内存中的少量数据。数据不驻留在 HDFS 上。它要么在本地文件系统上,要么可能在 S3 中。我不想启动和配置其他服务,例如 Hadoop、Hive 或 Spark。
我认为 Blaze/Odo 会让这成为可能:Odo 文档提到了 Parquet,但这些示例似乎都是通过外部 Hive 运行时进行的。
更新:自从我回答这个问题以来,为了更好地读写镶木地板,Apache Arrow 已经做了很多工作。另外:http://wesmckinney.com/blog/python-parquet-multithreading/
有一个 python 实木复合地板 reader 效果相对较好:https://github.com/jcrobak/parquet-python
它将创建 python 个对象,然后您必须将它们移动到 Pandas DataFrame,因此该过程将比 pd.read_csv
慢。
pandas 0.21 介绍 new functions for 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')
以上link说明:
These engines are very similar and should read/write nearly identical parquet format files. These libraries differ by having different underlying dependencies (fastparquet by using numba, while pyarrow uses a c-library).
除了pandas,Apache pyarrow 还提供了将 parquet 转换为数据帧的方法
代码很简单,直接输入:
import pyarrow.parquet as pq
df = pq.read_table(source=your_file_path).to_pandas()
有关详细信息,请参阅 Apache pyarrow 中的文档 Reading and Writing Single Files
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()
写入 parquet 时,请考虑使用 brotli 压缩。通过使用 brotli 压缩,我将 8GB 文件镶木地板文件的大小减少了 70%。 Brotli 比 gzip、snappy、pickle 文件更小,速度更快 read/writes。尽管 pickle 可以做元组而 parquet 不能。
df.to_parquet('df.parquet.brotli',compression='brotli')
df = pd.read_parquet('df.parquet.brotli')
正在考虑名为 data
.parquet
文件
parquet_file = '../data.parquet'
open( parquet_file, 'w+' )
然后使用pandas.to_parquet
(this function requires either the fastparquet or pyarrow库)
parquet_df.to_parquet(parquet_file)
然后,使用pandas.read_parquet()
得到一个dataframe
new_parquet_df = pd.read_parquet(parquet_file)
镶木地板
第 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')