gpt4 book ai didi

scala - 为什么 Spark 不允许 map-side 与数组键组合?

转载 作者:行者123 更新时间:2023-12-04 05:37:52 25 4
gpt4 key购买 nike

我使用的是 Spark 1.3.1,我很好奇为什么 Spark 不允许在 map 端组合中使用数组键。
combineByKey function :

if (keyClass.isArray) {
if (mapSideCombine) {
throw new SparkException("Cannot use map-side combining with array keys.")
}
}

最佳答案

基本上出于同样的原因 default partitioner cannot partition array keys .

斯卡拉 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
  • 关于scala - 为什么 Spark 不允许 map-side 与数组键组合?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32698428/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com