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
答案 0 :(得分:6)
不,他们完全不同。回想一下,......不应该是V => V,就像mapValues ...
map
函数中存在不变量,它们会返回Iterable
(List
,Array
等)与原始列表相同的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))