为什么 Spark 不允许映射端与数组键结合?
Why Spark doesn't allow map-side combining with array keys?
我正在使用 Spark 1.3.1,我很好奇为什么 Spark 不允许在映射端组合中使用数组键。
一片combineByKey function
:
if (keyClass.isArray) {
if (mapSideCombine) {
throw new SparkException("Cannot use map-side combining with array keys.")
}
}
基本上与 default partitioner cannot partition array keys.
相同的原因
Scala Array
只是 Java 数组的包装器,它的 hashCode
不依赖于内容:
scala> val x = Array(1, 2, 3)
x: Array[Int] = Array(1, 2, 3)
scala> val h = x.hashCode
h: Int = 630226932
scala> x(0) = -1
scala> x.hashCode() == h1
res3: Boolean = true
表示两个内容完全相同的数组不相等
scala> x
res4: Array[Int] = Array(-1, 2, 3)
scala> val y = Array(-1, 2, 3)
y: Array[Int] = Array(-1, 2, 3)
scala> y == x
res5: Boolean = false
因此 Arrays
不能用作有意义的键。如果您不相信,请检查当您使用 Array
作为 Scala Map
:
的键时会发生什么
scala> Map(Array(1) -> 1, Array(1) -> 2)
res7: scala.collection.immutable.Map[Array[Int],Int] = Map(Array(1) -> 1, Array(1) -> 2)
如果您想使用集合作为键,您应该使用不可变数据结构,例如 Vector
或 List
。
scala> Map(Array(1).toVector -> 1, Array(1).toVector -> 2)
res15: scala.collection.immutable.Map[Vector[Int],Int] = Map(Vector(1) -> 2)
另请参阅:
我正在使用 Spark 1.3.1,我很好奇为什么 Spark 不允许在映射端组合中使用数组键。
一片combineByKey function
:
if (keyClass.isArray) {
if (mapSideCombine) {
throw new SparkException("Cannot use map-side combining with array keys.")
}
}
基本上与 default partitioner cannot partition array keys.
相同的原因Scala Array
只是 Java 数组的包装器,它的 hashCode
不依赖于内容:
scala> val x = Array(1, 2, 3)
x: Array[Int] = Array(1, 2, 3)
scala> val h = x.hashCode
h: Int = 630226932
scala> x(0) = -1
scala> x.hashCode() == h1
res3: Boolean = true
表示两个内容完全相同的数组不相等
scala> x
res4: Array[Int] = Array(-1, 2, 3)
scala> val y = Array(-1, 2, 3)
y: Array[Int] = Array(-1, 2, 3)
scala> y == x
res5: Boolean = false
因此 Arrays
不能用作有意义的键。如果您不相信,请检查当您使用 Array
作为 Scala Map
:
scala> Map(Array(1) -> 1, Array(1) -> 2)
res7: scala.collection.immutable.Map[Array[Int],Int] = Map(Array(1) -> 1, Array(1) -> 2)
如果您想使用集合作为键,您应该使用不可变数据结构,例如 Vector
或 List
。
scala> Map(Array(1).toVector -> 1, Array(1).toVector -> 2)
res15: scala.collection.immutable.Map[Vector[Int],Int] = Map(Vector(1) -> 2)
另请参阅: