PySpark读取CSV时分区数与maxPartitionBytes规则不符原因咨询
PySpark读取csv文件分区数不符合预期的原因解释
分区数计算逻辑
你之前的认知只覆盖了分区数计算的部分规则,PySpark SQL读取文件时的分区数由三个核心配置共同决定,不是仅依赖spark.sql.files.maxPartitionBytes:
spark.sql.files.maxPartitionBytes:单个分区可容纳的最大字节数,你的环境中该值为128MBspark.sql.files.openCostInBytes:打开单个文件的预估开销,默认值为4MB,用于核算小文件场景下的分区调度成本spark.sql.files.minPartitionNum:读取文件时的最小分区数,未显式配置时,默认取spark.default.parallelism的参数值
你得到8个分区的根因
- 你创建SparkSession时没有指定运行模式,默认使用
local[*]模式,该模式下spark.default.parallelism的取值等于设备的CPU核心数,你的8核笔记本对应取值为8,因此spark.sql.files.minPartitionNum的默认值为8 - 你的测试文件大小为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
相关产品推荐
相关产品推荐

