fold算子签名: def fold(zeroValue: T)(op: (T, T) => T): T ,算子其实就是先对rdd分区的每一个分区进行使用op函数,在调用op函数过程中将zeroValue参与计算,最后在对每一个分区的结果调用op函数,同理此处zeroValue再次参与计算!
此处op函数为:
val add = (x: Int, y: Int) => {
println(x + "\t" + y)
x + y
}
实战代码:
println(sc.parallelize(List(1, 2, 3, 4, 5, 6, 7, 8), 1).fold(10)(add)) //56
println(sc.parallelize(List(1, 2, 3, 4, 5, 6, 7, 8), 2).fold(10)(add)) //66
println(sc.parallelize(List(1, 2, 3, 4, 5, 6, 7, 8), 3).fold(10)(add)) //76
第一个就是一个分区,元素为:1,2,3,4,5,6,7,8 ,计算过程是现在该分区进行add求和(zeroValue参与计算),所以是1+2+3+4+5+6+7+8+10完成分区的计算,结果为46,最后在合并所有分区结果,由于只有一个分区,所以计算过程为46+10=56!
第二个两个分区:1,2,3,4和5,6,7,8两个分区,对分区分别进行计算为1+2+3+4+10=20,5+6+7+8+10=36,最后合并分区结果为20+36+10=66,
第三个同理!