Scala 学习之 aggregate函数
fold和reduce都要求函数的返回值类型需要和我们所操作的RDD类型相同,但是我们有时确实需要一个不同类型的返回值。eg:
在计算平均值时,需要记录便利过程中的计数以及元素的数量,这就需要我们返回一个二元组。可以先对数据使用map操作,来把元素转移为改元素和1的二元组,也就是我们希望的返回类型。这样reduce就可以以二元组的形式进行归约。
aggregate函数把我们从返回值类型必须与输入RDD类型相同的限制中解脱出来。与fold相似,使用aggregate时,需要我们期待返回的类型的初始值,然后通过一个函数吧RDD中的元素合并起来放入累加器。考虑到每个节点是在本地进行累加的,最终 还需要提供第二个函数来将累加器两两合并。eg:
1 val z = sc. parallelize ( List (1 ,2 ,3 ,4 ,5 ,6) , 2) 2 val result = z.aggregate((0,0))(//初始值 3 (acc,value)=>(acc._1+value,acc._2+1),//累加器 (元组累加元组结果,RDD单个元素值)=>(元组累加结果+RDD单个元素,元组累加计数+1) 4 (acc1,acc2)=>(acc1._1+acc2._1,acc1._2+acc2._2)//combine 合并函数 合并元组累加结果 5 )
6 val avg = result._1/result._2.toDouble