Pandas:从 parquet 文件中读取前 n 行?

问题描述 投票:0回答:7

我有一个 parquet 文件,我想将文件中的前

n
行读取到 pandas 数据框中。 我尝试过的:

df = pd.read_parquet(path= 'filepath', nrows = 10)

它不起作用并给了我错误:

TypeError: read_table() got an unexpected keyword argument 'nrows'

我也尝试过

skiprows
参数,但这也给了我同样的错误。

或者,我可以读取完整的 parquet 文件并过滤前 n 行,但这将需要更多的计算,而我想避免这种情况。

有什么办法可以实现吗?

python pandas parquet
7个回答
61
投票

接受的答案已过时。现在可以只将 parquet 文件的前几行读入 pandas,尽管它有点混乱并且依赖于后端。

要使用 PyArrow 作为后端进行阅读,请按照以下步骤操作:

from pyarrow.parquet import ParquetFile
import pyarrow as pa 

pf = ParquetFile('file_name.pq') 
first_ten_rows = next(pf.iter_batches(batch_size = 10)) 
df = pa.Table.from_batches([first_ten_rows]).to_pandas() 

更改行

batch_size = 10
以匹配您要读入的行数。


30
投票

在探索并与 pandas 开发团队取得联系后,最终结果是 pandas 在读取 parquet 文件时不支持参数

nrows
skiprows

原因是 pandas 使用

pyarrow
fastparquet
parquet 引擎来处理 parquet 文件,并且
pyarrow
不支持部分读取文件或通过跳过行读取文件(不确定
fastparquet
)。以下是 pandas github 上的问题链接供讨论。

https://github.com/pandas-dev/pandas/issues/24511


6
投票

使用 DuckDB 查询 Parquet

为了提供另一个视角,如果您熟悉 SQL,您可以考虑使用 DuckDB 来实现此目的。例如:

import duckdb
nrows = 10
file_path = 'path/to/data/parquet_file.parquet'
df = duckdb.query(f'SELECT * FROM "{file_path}" LIMIT {nrows};').df()

如果您使用分区镶木地板,上述结果将不包含任何分区列,因为该信息不存储在较低级别的文件中。相反,您应该将顶部文件夹标识为分区镶木地板数据集,并将其注册到 DuckDB 连接器:

import duckdb
import pyarrow.dataset as ds
nrows = 10
dataset = ds.dataset('path/to/data', 
                     format='parquet',
                     partitioning='hive')
con = duckdb.connect()
con.register('data_table_name', dataset)
df = con.execute(f"SELECT * FROM data_table_name LIMIT {nrows};").df()

您可以使用连接器注册多个数据集以启用更复杂的查询。我发现 DuckDB 使处理 Parquet 文件变得更加方便,尤其是在尝试在多个 Parquet 数据集之间进行 JOIN 时。使用

conda install python-duckdb
pip install duckdb

安装

3
投票

使用 pyarrow 数据集扫描仪:

import pyarrow.dataset as ds

n = 10
src_path = "/parquet/path"
df = ds.dataset(src_path).scanner().head(n).to_pandas()

2
投票

对我来说最直接的选择似乎是使用

dask
库作为

import dask.dataframe as dd
df = dd.read_parquet(path= 'filepath').head(10)

0
投票

作为替代方案,您可以使用AWS SDK for pandas中的S3 Select功能,如 Abdel Jaidi 在此答案中提出的

pip 安装 awswrangler

import awswrangler as wr df = wr.s3.select_query( sql="SELECT * FROM s3object s limit 5", path="s3://filepath", input_serialization="Parquet", input_serialization_params={}, use_threads=True, )
    

-2
投票
Parquet 文件是面向列的存储,专为此而设计...因此加载所有文件以访问一行是正常的。

© www.soinside.com 2019 - 2024. All rights reserved.