RDD算子其他的都比较好理解,唯独fold和agg这俩稍微比较难理解一点,因为scala语言这个语法个人感觉有点异于其他语言。
先说说reduce()函数,他和fold()函数也就一个初始值的区别:
val rdd=list1.parallelize(List(1,2,3,4))
rdd.reduce((x,y)=>x+y)
其实就是 1+2+3+4 返回10 ,x其实指代的就是返回值,y是对rdd元素的遍历。意思是对 l
中的数据进行累加。
对与fold()函数来说:
rdd.fold(0)((x,y)=>x+y)
这个计算其实 0 + 1 + 2 + 3 + 4.
reduce()
和fold()返回值的数据类型必须和rdd是一样的。aggregate()
函数就打破了这个限制。比如我返回(Int, Int)
。
2. rdd.aggregate(value)(seqOp, combOp)
要算平均值,我就有两个值是要求的,一个是rdd的各元素的累加和,另一个是元素计数,我初始化为(0, 0)
。
rdd.aggregate(0, 0)(seqOp, combOp)
seqOp是:(x, y) => (x._1 + y, x._2 + 1