2017-01-24 36 views
-1

我一直在讀一本書的火花,這例子是從書Scala中如何使用聚合工作?

input = List(1,2,3,4,5,6) 
val result = input.aggregate((0, 0))(
(acc, value) => (acc._1 + value, acc._2 + 1), 
(acc1, acc2) => (acc1._1 + acc2._1, acc1._2 + acc2._2)) 
val avg = result._1/result._2.toDouble 

我試圖理解它是如何工作的,什麼是在每一個步驟

(0,0)_1和_2在種子值或初始值 該列表被分成月RDD的 可以說RDD1集包含通過這個列表列表(1,2) 環

(ACC,值)
ACC = ???在循環的每次迭代期間值 值= ???在循環的每次迭代期間在列表(1,2)的第一次迭代期間,在循環的每次迭代期間

(acc,value)=>(acc._1 + value,acc._2 + 1) 什麼是acc._1和_2和值

(acc1,acc2)=>(acc1._1 + acc2._1,acc1._2 + acc2._2)) acc1(for 1,2)類似於3,2和acc2(對於3,4)是7,2 和這個函數添加3 + 7和2 + 2 = 10,4和將此值添加到下一組

親愛善良助手,

請不要使用吉格斯sed在斯卡拉,我已經閱讀並且不理解它,因此來求助。

對於列表(1,2)在列表的第一次迭代期間以及在該迭代期間,acc._1和acc._2的值是多少?值是多少?在第二次迭代期間什麼是值?他們的價值觀?

+0

旁白:http://stackoverflow.com/questions/30828056/how-does-aggregate-work-in-scala是密切相關的問題。 –

回答

0

aggregate通過承擔兩個功能,一個在分區內合併值和一個合併分區的功能。

第一函數(一個用於一個分區)可被更清楚地寫爲

((sum, count), value) => (sum + value, count + 1) 

第二功能(分區合併)可以寫成

((partition1Sum, partition1Count), (partition2Sum, partition2Count)) => 
    (partition1Sum + partition2Sum, partition1Count + partition2Count) 


關於元組符號的注意事項:

斯卡拉(a, b, c)._1 == a,等。 _n爲您提供了元組的第n個元素。

0

聚合函數的第一個參數需要一個初始值,其在本例中是一個元組(0,0),那麼下一個參數是seqop這是一個功能(B, A) => A,在你的榜樣,將(Tuple, Int) => Tuple

這裏發生的事情這個函數是一個一個地應用在列表的每個參數上的。該元組實際上在列表的左邊列舉了列表的總數,在右邊列出了迄今爲止列表的數量。聚合功能的結果是(21, 6)

附註:Scala中TraversableOnce的實現並不真正使用combop參數,在本例中爲(acc1, acc2) => (acc1._1 + acc2._1, acc1._2 + acc2._2))因此,在這種情況下,您可以忽略它。如果您熟悉斯卡拉是被執行的代碼是:

input.foldLeft((0, 0))((acc, value) => (acc._1 + value, acc._2 + 1))