reduceByKey 在 Spark 2 和 Spark 3 之间提供不同的输出

问题描述 投票:0回答:0

我有以下代码:

      .flatMap {
        case ((a, b), c) =>
          aggregations.flatMap(definition =>
            definition
              .map(_
                .distinct
                .map(p => (
                  (a, b, definition.defNames), // This is the key
                  (
                    // something
                )))
          ).flatten
      }
      .reduceByKey { case ((w1, x1, y1, z1), (w2, x2, y2, z2)) =>

在密钥中,

b
是一个字符串,而
a
definition.defNames
都是类。 据我了解,reduceByKey 应该按键
(a, b, definition.defNames)
对输出进行分组。 在 Spark 2.4.8 中,这完全符合预期,但是当我在 Spark 3.3.1 中运行它时,它没有正确减少它。在输出中,有 2 个项目应该组合在一起,因为键是相同的,但它们不是。 当我使用以下作为键时:

(a.toString, b, definition.defNames.toString)

Spark 3.3.1 减少它就好了。 我逐步检查了代码并检查了两个未合并条目的 a 和 definition.defNames 的 hashCode 值,它们是相同的。 具有完全相同输入的完全相同的代码在 Spark 2.4.8 和 Spark 3.3.1 之间产生不同的结果。这可能是什么原因?

使用类的字符串表示作为键。那奏效了。 显式覆盖

equals
hashCode
类的
a
definition.defNames
方法。这没有用。

scala apache-spark hashcode
© www.soinside.com 2019 - 2024. All rights reserved.