我有一个spark java程序,其中groupByKey带有mapValues步骤,它返回一个PairRDD,其值为所有输入rdd值的Iterable
。
我已经读过用mapValues替换groupByKey替换reduceByKey会带来性能提升,但我不知道如何在这里将reduceByKey
应用于我的问题。
具体来说,我有一个输入对RDD,其值为Tuple5
。在groupByKey和mapValues转换之后,我需要获得一个键值对RDD,其中值必须是输入值的Iterable。
JavaPairRDD<Long,Tuple5<...>> inputRDD;
...
...
...
JavaPairRDD<Long, Iterable<Tuple5<...>>> groupedRDD = inputRDD
.groupByKey()
.mapValues(
new Function<Iterable<Tuple5<...>>,Iterable<Tuple5<...>>>() {
@Override
public Iterable<Tuple5<...>> call(
Iterable<Tuple5<...>> v1)
throws Exception {
/*
Some steps here..
*/
return mappedValue;
}
});
有没有办法让我使用reduceByKey
进行上述转换?
答案 0 :(得分:1)
我一直在Spark上使用Scala,所以这不是你可能更喜欢的确切答案。 groupByKey/mapValues
和reduceByKey
之间编码的主要区别可以通过改编自article的简单示例来看待:
val words = Array("one", "two", "two", "three", "three", "three")
val wordPairsRDD = sc.parallelize(words).map(word => (word, 1))
val wordCountsWithGroup = wordPairsRDD.
groupByKey.
mapValues(_.sum)
wordCountsWithGroup.collect
res1: Array[(String, Int)] = Array((two,2), (one,1), (three,3))
val wordCountsWithReduce = wordPairsRDD.
reduceByKey(_ + _)
wordCountsWithReduce.collect
res2: Array[(String, Int)] = Array((two,2), (one,1), (three,3))
在此示例中,x => x.sum
中使用mapValues
(即_.sum),(acc, x) => acc + x
中的reduceByKey
(即_ + _)。功能签名有很大的不同。在mapValues
中,您正在处理分组值的集合,而在reduceByKey
中您正在执行缩减。