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

San*_*mar 21 python pandas parquet

我有一个镶木地板文件,我想n将文件中的第一行读入熊猫数据框中。我试过的:

df = pd.read_parquet(path= 'filepath', nrows = 10)
Run Code Online (Sandbox Code Playgroud)

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

TypeError: read_table() got an unexpected keyword argument 'nrows'
Run Code Online (Sandbox Code Playgroud)

我也尝试过这个skiprows论点,但这也给了我同样的错误。

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

有什么方法可以实现吗?

Dav*_*tan 67

接受的答案已过时。现在可以只将 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() 
Run Code Online (Sandbox Code Playgroud)

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

  • 我们也可以读取随机行吗? (6认同)
  • 您还可以选择某些行来读取@DavidKaftan吗?示例:从一个非常大的镶木地板文件中,我只想读取索引为 13673、14762 和 68712 的行。你会怎么做? (6认同)

San*_*mar 23

在四处探索并与 Pandas 开发团队取得联系后,终点是 Pandas 不支持参数nrowsskiprows在阅读 parquet 文件时。

原因是熊猫使用pyarrowfastparquet镶木地板引擎来处理镶木地板文件,pyarrow并且不支持部分读取文件或通过跳过行读取文件(不确定fastparquet)。以下是pandas github上的issue讨论链接。

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


Jvi*_*iec 7

使用 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()
Run Code Online (Sandbox Code Playgroud)

如果您使用分区镶木地板,则上述结果将不包含任何分区列,因为该信息不存储在较低级别的文件中。相反,您应该将顶层文件夹标识为分区 parquet 数据集,并将其注册到 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()
Run Code Online (Sandbox Code Playgroud)

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


B. *_* M. 5

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

  • 当您获得一个包含 10 亿行的 10GB 大小的文件(其中仅 100 万行就足以满足您的需求)时,说这是正常的并没有多大帮助。 (8认同)
  • 是的,镶木地板是基于柱的。但是,列被分为*行组*。这意味着只能读取 parquet 文件的一部分(即一个行组)。请参阅 https://parquet.apache.org/documentation/latest/ 和 https://arrow.apache.org/docs/python/parquet.html#finer-grained-reading-and-writing Apache Spark 能够并行读取和处理不同机器上同一 parquet 文件的不同行组。 (4认同)