Spark:reduceByKey的自定义键比较方法

时间:2015-07-08 15:07:48

标签: scala hadoop apache-spark key-value reduce

我需要在Scala中使用我自己的类作为键/值对中的键。特别是,我有一个包含两个变量id1id2的简单类,我希望这些元素仅基于id2而不是id1进行分组。我在网上找不到有关如何以及在何处覆盖reduceByKey()方法的比较方法的信息,以便它可以根据我的自定义compare()方法使用相同的键对元素进行分组。

感谢任何帮助。 谢谢。

3 个答案:

答案 0 :(得分:3)

您无法覆盖reduceByKey的比较,因为它无法使用您的数据经常被整个群集中的单独执行程序上的密钥洗牌的事实。您可以更改密钥(并注意,根据您使用的转换/操作,这可能会重新调整数据)。

在RDD中有一个非常好的方法来执行此操作,称为keyBy,因此您可以执行以下操作:

val data: RDD[MyClass] = ...    // Same code you have now.
val byId2 = data.keyBy(_.id2)   //Assuming your ids are Longs, will produce a RDD[(Long,MyClass)]

答案 1 :(得分:2)

If you are able to alter your class, then reduceByKey uses equals and hashCode. So, you can make sure those are defined and that will result in the correct comparisons being used.

答案 2 :(得分:0)

你不能只map RDD,以便该对的第一个元素是你想要使用的键吗?

case class MyClass(id1: Int, id2: Int)
val rddToReduce: Rdd[(MyClass, String)] = ... //An RDD with MyClass as key

rddToReduce.map {
  case (MyClass(id1, id2), value) => (id2, (id1, value)) //now the key is id2
} .reduceByKey {
  case (id1, value) => //do the combination here
  ...
} .map {
  case (id2, (id1, combinedValue)) =>
  (MyClass(id1, id2), combinedValue) //rearrange so that MyClass is the key again
}