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

为何spark.sparkContext.textFile与spark.read.json的RDD分区数不同?

问题分析:textFile与read.json分区数差异原因

核心差异源于两种读取方式的分区策略不同:

  1. sparkContext.textFile的分区逻辑
    textFile是基于RDD的底层文件读取API,它的分区规则是:
  • 对于本地文件系统中的多个小文件(每个文件大小远小于默认blockSize即128MB),每个文件会单独对应一个RDD分区。你这里有3个JSON文件,因此生成3个分区,和代码断言结果一致。
  • 若文件大小超过blockSize,则会按blockSize拆分出多个分区。
  1. spark.read.json的分区逻辑
    read.json属于Spark SQL的DataSource API,其分区策略由通用文件扫描层统一控制,核心参数为spark.sql.files.maxPartitionBytes(默认值128MB):
  • 读取多个小文件时,Spark会将总大小不超过maxPartitionBytes的多个文件合并到同一个分区中。如果你的3个JSON文件总大小远小于128MB,就会被合并为1个分区。
  • 这种合并逻辑并非在JsonDataSourceV2中实现,而是在通用文件扫描模块(如FileSourceScanExec)中处理,因此单独查看JSON数据源的代码找不到相关逻辑。

验证与调整方法

  • 查看3个JSON文件的总大小,若远小于128MB即可验证上述结论。
  • 若需要让read.json生成与textFile一致的分区数,可调整参数强制每个文件单独分区:
    spark.conf.set("spark.sql.files.maxPartitionBytes", "1b")
    val df = spark.read.json(path)
    assert(df.rdd.getNumPartitions == 3)
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 08:13:22