为啥 Spark 不允许 map-side 与数组键组合?
Posted
技术标签:
【中文标题】为啥 Spark 不允许 map-side 与数组键组合?【英文标题】:Why Spark doesn't allow map-side combining with array keys?为什么 Spark 不允许 map-side 与数组键组合? 【发布时间】:2015-09-21 14:57:09 【问题描述】:我正在使用 Spark 1.3.1,我很好奇为什么 Spark 不允许在映射端组合中使用数组键。
一片combineByKey function
:
if (keyClass.isArray)
if (mapSideCombine)
throw new SparkException("Cannot use map-side combining with array keys.")
【问题讨论】:
您能详细说明一下吗?你想用钥匙做什么?或者你想要什么你不能键入? 【参考方案1】:基本上与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)
另见:
SI-1607 How does HashPartitioner work? A list as a key for PySpark's reduceByKey【讨论】:
以上是关于为啥 Spark 不允许 map-side 与数组键组合?的主要内容,如果未能解决你的问题,请参考以下文章