了解reduceByKey函数定义Spark Scala

时间:2017-03-25 22:57:42

标签: scala apache-spark

spark中reduceByKey的{​​{1}}函数具有以下定义:

Pair RDD

我理解def reduceByKey(func: (V, V) => V): RDD[(K, V)] 采用参数函数将其应用于键的值。我想要了解的是如何阅读这个定义,其中函数将2个值作为输入,即reduceByKey。不应该是(V, V) => V,就像函数应用于值V的V => V函数一样,以产生U,它是相同或不同类型的值:

mapValues

这是因为def mapValues[U](f: (V) ⇒ U): RDD[(K, U)] 一次应用于所有值(对于同一个键),并且reduceByKey一次一个地应用于每个值(无论密钥是什么?),哪种情况不应该被定义为mapValues

2 个答案:

答案 0 :(得分:6)

  

......不应该是V => V,就像mapValues ...

不,他们完全不同。回想一下,map函数中存在不变量,它们会返回IterableListArray等)与原始列表相同的length (映射的)。另一方面,reduce函数聚合合并所有元素,在这种情况下,reduceByKey通过应用函数组合对或值,定义来自一个名为monoid的数学概念。你可以这样看,你通过应用函数组合列表的两个第一个元素,并且该操作的结果应该与第一个元素的类型相同,用第三个元素操作,依此类推,直到你最终只有一个元素。

答案 1 :(得分:1)

mapValues转换RDD中每对第二部分应用f:(V)⇒U而reduceByKey将所有具有相同键的对减少到一对应用f:(V,V)=> V

val data = Array((1,1),(1,2),(1,4),(3,5),(3,7))
val rdd = sc.parallelize(data)
rdd.mapValues(x=>x+1).collect
// Array((1,2),(1,3),(1,5),(3,6),(3,8))
rdd.reduceByKey(_+_).collect
// Array((1,7),(3,12))