Spark中的aggregate和aggregateByKey的區別及疑惑

aggregate(zeroValue,seq,comb,taskNums)

將初始值和第一個分區中的第一個元素傳遞給seq函數進行計算,然後將計算結果和第二個元素傳遞給seq函數,直到計算到最後一個值。第二個分區中也是同理操作。最後將初始值、所有分區的結果經過combine函數進行計算(先將前兩個結果進行計算,將返回結果和下一個結果傳給combine函數,以此類推),並返回最終結果。

>>> data = sc.parallelize((1,2,3,4,5,6),2)
>>> def seq(a,b):
...     print 'seqOp:'+str(a)+"\t"+str(b)
...     return min(a,b)
... 
>>> def combine(a,b):
...     print 'comOp:'+str(a)+"\t"+str(b)
...     return a+b
... 
>>> data.aggregate(3,seq,combine)
seqOp:3  1
seqOp:1  2
seqOp:1  3
seqOp:3  4
seqOp:3  5
seqOp:3  6
comOp:3  1
comOp:4  3
7
>>>

從上面的代碼的輸出結果可以看出,1,2,3被分到一個分區中,4,5,6被分到一個分區中。3先和第一個元素1傳給seq函數,返回最小值1,然後將1和第二個元素2傳給seq函數,返回1,以此類推,最後返回第一個分區中的最小值1。第二個分區一樣道理,最後結果返回最小值3.最後將初始值3和兩個分區的結果經過combine函數進行計算,先將初始值3和第一個分區的結果1傳給combine函數,返回4,然後將4和第二個分區結果3傳給combine函數,返回最終結果7。

aggregateByKey(zeroValue,seq,comb,taskNums)

在kv對的RDD中,,按key將value進行分組合並,合併時,將每個value和初始值作爲seq函數的參數,進行計算,返回的結果作爲一個新的kv對,然後再將結果按照key進行合併,最後將每個分組的value傳遞給combine函數進行計算(先將前兩個value進行計算,將返回結果和下一個value傳給combine函數,以此類推),將key與計算結果作爲一個新的kv對輸出。

見代碼:

>>> data = sc.parallelize([(1,3),(1,2),(1,4),(2,3)])
>>> def seq(a,b):
...     return max(a,b)
... 
>>> def combine(a,b):
...     return a+b
... 
>>> data.aggregateByKey(3,seq,comb,4).collect()
[(1, 10), (2, 3)]

但是,在使用時遇到了問題,困惑:

在啓動pyspark時,如果是./bin/pyspark –master local[3]或3以上的數字或*都會返回預期的結果。
如果數字小魚等於2,結果就會有出入。如[(1,7)(2,3)]。
不知道什麼原因,網上有人說:懷疑對於data的計算默認使用並行計算,而我們設置lcoal時沒有指定所用的cores數目,導致並行計算無法執行,只能保持某個計算結果,最終導致計算結果的錯誤。。。

發佈了71 篇原創文章 · 獲贊 322 · 訪問量 55萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章