spark:reducebykey的自定义键比较方法

b0zn9rqh  于 2021-05-29  发布在  Hadoop
关注(0)|答案(3)|浏览(576)

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

ewm0tg9j

ewm0tg9j1#

你就不能 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
}
qlfbtfca

qlfbtfca2#

你不能忽略 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)]
fkaflof6

fkaflof63#

如果你能改变你的课程,那么 reduceByKey 使用 equals 以及 hashCode . 因此,您可以确保这些都已定义,这将导致使用正确的比较。

相关问题