對於
Array(('a',1), ('a',2), ('b',3), ('a',4), ('a',15))
如何計算平均值呢:
原來通過計算兩邊,第一遍計算總次數
val a = sc.parallelize(data).map(x=>1)
val b = sc.parallelize(data).map(x=>x._2)
val count = a.reduce(_+_)
val value = b.reduce(_+_)
print(value/count)
但是這樣需要對數據做兩次處理,效率大大的下降。能不能只對數據做一次處理就能得到次數和總和呢。以下方法可以做到。
val data = Array(('a',1), ('a',2), ('b',3), ('a',4), ('a',15))
//此處將tuple第一項設置為次數,第二項為待相加的值
val distData = sc.parallelize(data).map(x=>(1,x._2))
//聚合方法,第一項計算總數,第二項計算總和
val add =(x:(Int,Int),y:(Int,Int))=>{(x._1+y._1,x._2+y._2)}
//開始計算,最后的結果是 (次數,總和)
val ret = distData.reduce(add)
//計算平均值
print(ret._2/ret._1)
通過修改add方法,將計算的結果放入到tuple中,即可對數據一次處理時,得到想要的結果。
