groupByKey 在火花中无法正常工作

Posted

技术标签:

【中文标题】groupByKey 在火花中无法正常工作【英文标题】:groupByKey not properly working in spark 【发布时间】:2015-06-09 12:29:02 【问题描述】:

所以,我有一个 RDD,它有如下键值对。

(Key1, Val1)
(Key1, Val2)
(Key1, Val3)
(Key2, Val4)
(Key2, Val5)

在 groupByKey 之后,我希望得到类似的东西

Key1, (Val1, Val2, Val3)
Key2, (Val4, Val5)

但是,我发现即使在执行 groupByKey() 之后,也会重复相同的键。键值对的总数肯定减少了,但仍然有很多重复的键。可能是什么问题?

键的类型基本上是一个具有整数类型字段的 Java 类。难道spark也在考虑对象的字段以外的东西来识别那些对象?

【问题讨论】:

我不知道这个问题的确切原因。但我建议你使用 reducebykey。它在性能方面比 groupbykey 更好。在大的情况下 groupbykey 也会给你带来严重的问题。 @shivams:但是 reduceBykey 不是用于不同的目的吗?例如总结一个键的值?虽然 groupForKey 用于收集给定键的列表中的值?还是没有? shivams 假设您要对列表进行聚合。这就是大多数时候发生的事情。但如果您需要实际列表,那么groupByKey 就是您的票。 reduceByKey 应该在可能的情况下优先于 groupByKey,但是正如您所说,使用两者都有很好的理由。虽然这不是问题的重点!在您的 Java 类中,您是否正确覆盖了 .equals 和 hashcode()?如果没有,您可以发布一些代码吗? @DanielDarabos Okey 我读到 reducebykey 比 groupbykey 更好。但我认为 groupbykey 的每一个案例都不能被替换。如果我错了,请纠正我。 【参考方案1】:

groupByKey 和 Spark 中的许多其他方法都依赖于对象哈希。如果您的类的两个实例没有返回相同的hashCode,那么即使它们的所有字段都相等,Spark 也不会认为它们相等。

确保覆盖equalshashCode

【讨论】:

像魅力一样工作。谢谢:)!

以上是关于groupByKey 在火花中无法正常工作的主要内容,如果未能解决你的问题,请参考以下文章

火花中的Java 8流开销

JAVA - Apache BEAM- GCP:GroupByKey 与 Direct Runner 一起工作正常,但与 Dataflow runner 一起失败

无法在纱线簇模式下读取带有火花的Hbase数据

多节点火花集群上的 spark-shell 无法在远程工作节点上旋转执行程序

有没有办法在火花流中展平嵌套的 JSON?

Spark DataFrame 的 groupBy vs groupByKey