Apache spark Spark HashPartitioner意外分区
我正在使用Apache spark Spark HashPartitioner意外分区,apache-spark,rdd,Apache Spark,Rdd,我正在使用HashPartioner,但得到了一个意外的结果。 我使用3个不同的字符串作为键,并将分区参数设为3,所以我希望有3个分区 val cars=Array(“本田”、“丰田”、“起亚”) val carnamePrice=sc.parallelize(用于{ x+“->”+索引)。迭代器 } } 地图。采取(10) 结果如下。它只提供2个分区。我检查了字符串的哈希代码 (69909220 75427 -1783892706). 这里有什么问题?可能我误解了分区算法 Array[Str
HashPartioner
,但得到了一个意外的结果。
我使用3个不同的字符串作为键,并将分区参数设为3,所以我希望有3个分区
val cars=Array(“本田”、“丰田”、“起亚”)
val carnamePrice=sc.parallelize(用于{
x+“->”+索引)。迭代器
}
}
地图。采取(10)
结果如下。它只提供2个分区。我检查了字符串的哈希代码
(69909220 75427 -1783892706). 这里有什么问题?可能我误解了分区算法
Array[String]=数组((丰田,100)->0,(丰田,200)->0,(丰田,300)->0,(本田,100)->1,(本田,200)->1,(本田,300)->1,(起亚,100)->1,(起亚,200)->1,(起亚,300)->1)
这里没有什么奇怪的事情,由HashPartitioner使用的
实现如下:
def nonNegativeMod(x:Int,mod:Int):Int={
val rawMod=x%mod
rawMod+(如果(rawMod<0)mod else 0)
}
通过3个分区,密钥分发定义如下所示:
用于{car nonNegativeMod(car.hashCode,3))
Seq[(字符串,Int)]=列表((本田,1)、(丰田,0)、(起亚,1))
换句话说,没有直接哈希冲突并不保证没有任意数模的冲突