我有以下代码:
.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
方法。这没有用。