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

PySpark读取CSV时分区数与maxPartitionBytes规则不符原因咨询

PySpark读取csv文件分区数不符合预期的原因解释

分区数计算逻辑

你之前的认知只覆盖了分区数计算的部分规则,PySpark SQL读取文件时的分区数由三个核心配置共同决定,不是仅依赖spark.sql.files.maxPartitionBytes:

  • spark.sql.files.maxPartitionBytes:单个分区可容纳的最大字节数,你的环境中该值为128MB
  • spark.sql.files.openCostInBytes:打开单个文件的预估开销,默认值为4MB,用于核算小文件场景下的分区调度成本
  • spark.sql.files.minPartitionNum:读取文件时的最小分区数,未显式配置时,默认取spark.default.parallelism的参数值

你得到8个分区的根因

  1. 你创建SparkSession时没有指定运行模式,默认使用local[*]模式,该模式下spark.default.parallelism的取值等于设备的CPU核心数,你的8核笔记本对应取值为8,因此spark.sql.files.minPartitionNum的默认值为8
  2. 你的测试文件大小为96MB,小于128MB的单分区最大容量,按照容量计算仅需要1个分区,但Spark会优先保证分区数不低于最小分区数的配置,因此最终读取后的分区数为8。

验证方法

你可以通过调整配置复现预期的1分区结果:

方案1:显式指定最小分区数

spark = SparkSession.builder \
    .config("spark.sql.files.minPartitionNum", 1) \
    .getOrCreate()

方案2:指定local模式的核心数

spark = SparkSession.builder \
    .master("local[1]") \
    .getOrCreate()

调整配置后重新运行测试代码,sd.rdd.getNumPartitions()就会返回1。

补充说明:如果csv文件使用了gzip等不可拆分的压缩格式,Spark无法对单个文件做拆分,此时分区数最多等于待读取的文件数量,不受minPartitionNum配置影响。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 16:15:06