为何spark.sparkContext.textFile与spark.read.json的RDD分区数不同?
问题分析:textFile与read.json分区数差异原因
核心差异源于两种读取方式的分区策略不同:
- sparkContext.textFile的分区逻辑
textFile是基于RDD的底层文件读取API,它的分区规则是:
- 对于本地文件系统中的多个小文件(每个文件大小远小于默认
blockSize即128MB),每个文件会单独对应一个RDD分区。你这里有3个JSON文件,因此生成3个分区,和代码断言结果一致。 - 若文件大小超过
blockSize,则会按blockSize拆分出多个分区。
- 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
相关产品推荐
相关产品推荐

