熊猫:从镶木地板文件中读取前 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文件时不支持nrows
或skiprows
参数。
原因是 pandas 使用pyarrow
或fastparquet
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 行?的主要内容,如果未能解决你的问题,请参考以下文章