熊猫:从镶木地板文件中读取前 n 行?

Posted

技术标签:

【中文标题】熊猫:从镶木地板文件中读取前 n 行?【英文标题】:Pandas : Reading first n rows from parquet file? 【发布时间】:2019-05-27 17:10:50 【问题描述】:

我有一个 parquet 文件,我想先将文件中的 n 行读入 pandas 数据框。 我尝试了什么:

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

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

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

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

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

有什么方法可以实现吗?

【问题讨论】:

Parquet 文件的部分按行读取现在是可能的(使用 PyArrow 作为后端),如下所示:***.com/a/69888274/9962007 【参考方案1】:

在探索并与pandas开发团队取得联系后,发现pandas在读取parquet文件时不支持nrowsskiprows参数。

原因是 pandas 使用pyarrowfastparquet parquet 引擎来处理 parquet 文件,而pyarrow 不支持部分读取文件或通过跳过行读取文件(不确定fastparquet)。以下是pandas github上issue的链接供大家讨论。

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

【讨论】:

【参考方案2】:

接受的答案已过期。现在可以只将 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 以匹配您要读取的行数。

【讨论】:

而且速度也很快(1m 行 x 2k 列需要 10 秒)【参考方案3】:

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

【讨论】:

是的,镶木地板是基于列的。但是,列分为行组。这意味着可以只读取 parquet 文件的一部分(即一个行组)。请参阅 parquet.apache.org/documentation/latest 和 arrow.apache.org/docs/python/…。 Apache Spark 能够在不同机器上并行读取和处理同一 parquet 文件的不同行组。

以上是关于熊猫:从镶木地板文件中读取前 n 行?的主要内容,如果未能解决你的问题,请参考以下文章

Spark:从镶木地板中读取一个 int 列,只要

如何从镶木地板文件创建表格

如何从镶木地板文件中获取架构/列名?

重命名后如何从镶木地板文件中恢复旧列值?

从镶木地板表中选择在蜂巢中不返回任何内容

如何使用 pyarrow 从 S3 读取镶木地板文件列表作为熊猫数据框?