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
相关产品推荐
相关产品推荐

