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

使用pandas读取Spark生成的排序Parquet目录时,顺序是否保留?

问题解答

Spark通过OrderBy排序后生成的多份Parquet文件,单个文件内部的数据是有序的,但pandas直接读取整个目录时,无法保证全局排序和Spark输出的一致。

具体原因:

  • Spark执行OrderBy后,会把全局有序的数据拆分成多个分区输出,每个分区内的数据连续且有序,输出的文件名通常是part-00000.parquet、part-00001.parquet这类按分区号递增的格式,对应全局排序的分段。但pandas读取目录下的Parquet文件时,默认是按照文件系统返回的文件列表顺序加载,这个顺序不一定严格遵循文件名的数字排序逻辑(比如部分文件系统会按字符串排序,或返回顺序不稳定)。
  • 直接调用pandas.read_parquet("Path_to/Directory_containing_200parquet_files")得到的DataFrame,其行顺序可能和Spark排序后的全局顺序不一致。

如果要确保读取后保留原全局排序,有两种可行方案:

  1. 手动按文件名的数字顺序加载合并
    先获取所有Parquet文件路径,按文件名中的分区编号排序后再依次读取合并,示例代码:
    import pandas as pd
    import glob
    import re
    
    # 获取目录下所有parquet文件
    file_list = glob.glob("Path_to/Directory_containing_200parquet_files/*.parquet")
    # 按文件名中的数字编号排序
    file_list.sort(key=lambda f: int(re.findall(r'part-(\d+)', f)[0]))
    # 逐个读取并合并
    merged_df = pd.concat([pd.read_parquet(file) for file in file_list], ignore_index=True)
    
  2. Spark输出时直接生成单个文件
    在Spark写入前重分区为1个分区,比如df.orderBy("col").repartition(1).write.parquet("output_path"),这样输出就是单个Parquet文件,pandas读取时自然保持排序。但这种方式只适合数据量不大的场景,单分区会导致Spark任务性能下降,甚至OOM。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 10:20:22