Spark中groupBy两种写法分区结果不同的原因求解
Spark groupBy分组分区差异的原因
核心原因是两种写法的分组Key类型不同,导致Spark默认的哈希分区器计算出的分区位置完全一致,最终所有分组都落到了同一个分区。
具体拆解:
Spark的groupBy默认会沿用原RDD的分区数,并用HashPartitioner根据Key的哈希值分配分区,分配规则是:
分区编号 = key.hashCode() % 分区数
第一种写法:groupBy(_ % 2)
- 分组Key是Int类型的
0和1 - 计算分区:
0.hashCode() = 0,0 % 2 = 0→ 分配到分区01.hashCode() = 1,1 % 2 = 1→ 分配到分区1
所以两个分组分别进入不同分区。
第二种写法:groupBy(_ % 2 == 0)
- 分组Key是Boolean类型的
true和false - Java/Scala中布尔值的哈希值是固定的:
true.hashCode()=1231,false.hashCode()=1237 - 计算分区:
1231 % 2 = 1→ 分配到分区11237 % 2 = 1→ 分配到分区1
两个Key的取模结果完全相同,最终所有分组都集中在同一个分区。
解决办法(可选)
如果想让布尔分组也分到不同分区,可以把布尔值转为Int类型,比如:
val result = rdd.groupBy( x => (x % 2 == 0).toInt )
此时Key变回0和1,就会和第一种写法一样分到不同分区。
内容的提问来源于stack exchange,提问作者AlexFu
相关产品推荐
相关产品推荐

