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
}
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)]
3条答案
按热度按时间ewm0tg9j1#
你就不能
map
这个RDD
所以成对的第一个元素就是你想用的键?qlfbtfca2#
你不能忽略
reduceByKey
因为它无法使用这样一个事实,即您的数据经常在集群中的各个执行器上被密钥洗牌。不过,您可以更改密钥(注意,根据您使用的转换/操作,这可能会重新洗牌数据)。rdd中有一个很好的方法来实现这一点
keyBy
,所以你可以这样做:fkaflof63#
如果你能改变你的课程,那么
reduceByKey
使用equals
以及hashCode
. 因此,您可以确保这些都已定义,这将导致使用正确的比较。