You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python中高效列出Parquet文件分区的方法

高效获取分区式Parquet的分区列表

方法1:使用PyArrow(推荐)

PyArrow可以直接读取Parquet数据集的元数据,完全不需要加载任何数据文件,是效率最高的方案:

import pyarrow.parquet as pq

# 加载Parquet数据集对象
dataset = pq.ParquetDataset("myparquet.parquet")
# 提取单分区列的所有取值
partition_values = [part[0] for part in dataset.partitions.flatten()]
print(partition_values)  # 输出: [1, 2]

如果是多分区列的结构,flatten()会返回每个分区的元组(比如(val1, val2)),按需提取对应位置的值即可。

方法2:使用Fastparquet

Fastparquet同样支持直接读取分区元数据,无需扫描数据文件:

from fastparquet import ParquetFile

pf = ParquetFile("myparquet.parquet")
# 直接获取指定分区列的所有取值
partition_values = list(pf.cats['partition_col'])
print(partition_values)  # 输出: [1, 2]

pf.cats会存储每个分区列的所有可能取值(类别),直接提取目标列的列表即可。

方法3:直接遍历文件系统(无依赖方案)

如果不想引入Parquet处理库,可以利用分区Parquet的目录命名规则(partition_col=value),直接遍历目录提取值:

import os

base_path = "myparquet.parquet"
partition_values = []
for entry in os.scandir(base_path):
    if entry.is_dir() and "=" in entry.name:
        # 分割目录名获取分区值
        _, val = entry.name.split("=", 1)
        # 按需转换类型(比如从字符串转整数)
        partition_values.append(int(val))
print(partition_values)  # 输出: [1, 2]

这种方法完全基于文件系统操作,适合结构简单的分区场景。


为什么你的Pandas方法效率低?

pd.read_parquet(columns=["partition_col"])虽然只指定了分区列,但Pandas默认会扫描所有数据文件来读取该列的全量值——它不会自动解析目录中的分区元数据,而是实际加载文件内容,所以千万级数据量下会异常缓慢。上面的方案都是直接读取元数据或目录结构,完全不碰数据文件,效率提升几个数量级。

内容的提问来源于stack exchange,提问作者ronkov

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 22:22:12