为啥 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)

如果您想使用集合作为键,您应该使用不可变的数据结构,例如 VectorList

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 与数组键组合?的主要内容,如果未能解决你的问题,请参考以下文章

Spark学习之路 SparkCore的调优之开发调优

为啥不允许将数组按值传递给 C 和 C++ 中的函数?

为啥我不能将两个数组与“包含”进行比较? [复制]

大数据之Spark:简述你知道的spark调优

Spark性能优化指南--基础篇

为啥 sortBy() 不能在 Spark 中对数据进行均匀排序?