Spark的fold()和aggregate()函數(shù)

轉(zhuǎn)載請(qǐng)注明出處:http://www.reibang.com/p/15739e95a46e
@貳拾貳畫生


最近在學(xué)習(xí)spark,理解這兩個(gè)函數(shù)時(shí)候費(fèi)了一些勁,現(xiàn)在記錄一下禾锤。

1. rdd.fold(value)(func)

說到fold()函數(shù)蛔屹,就不得不提一下reduce()函數(shù)茂卦,他倆的區(qū)別就在于一個(gè)初始值青团。
reduce()函數(shù)是這樣寫的:

rdd.reduce(func)

參數(shù)是一個(gè)函數(shù)譬巫,這個(gè)函數(shù)的對(duì)rdd中的所有數(shù)據(jù)進(jìn)行某種操作,比如:

val l = List(1,2,3,4)
l.reduce((x, y) => x + y)

對(duì)于這個(gè)x督笆,它代指的是返回值芦昔,而y是對(duì)rdd各元素的遍歷。
意思是對(duì) l中的數(shù)據(jù)進(jìn)行累加娃肿。
flod()函數(shù)相比reduce()加了一個(gè)初始值參數(shù):

rdd.fold(value)(func)

scala的語法確實(shí)是比較奇怪的咕缎,既然有兩個(gè)參數(shù),你就不能把兩個(gè)參數(shù)放在一個(gè)括號(hào)里嗎料扰?也是醉了凭豪,這種寫法確實(shí)容易讓人迷惑。

val l = List(1,2,3,4)
l.fold(0)((x, y) => x + y)

這個(gè)計(jì)算其實(shí) 0 + 1 + 2 + 3 + 4记罚,而reduce()的計(jì)算是:1 + 2 + 3 + 4墅诡,沒有初始值,或者說rdd的第一個(gè)元素值是它的初始值桐智。

2. rdd.aggregate(value)(seqOp, combOp)

剛才說到reduce()fold()末早,這兩個(gè)函數(shù)有一個(gè)問題,那就是它們的返回值必須與rdd的數(shù)據(jù)類型相同说庭,啥意思呢然磷?比如剛才那個(gè)例子,l的數(shù)據(jù)是Int刊驴,那么reduce()flod()返回的也必須是Int姿搜。
aggregate()函數(shù)就打破了這個(gè)限制。比如我返回(Int, Int)捆憎。這很有用舅柜,比如我要計(jì)算平均值的時(shí)候。
要算平均值躲惰,我就有兩個(gè)值是要求的致份,一個(gè)是rdd的各元素的累加和,另一個(gè)是元素計(jì)數(shù)础拨,我初始化為(0, 0)氮块。
那么就是:

val l = List(1,2,3,4)
l.aggregate(0, 0)(seqOp, combOp)

那么seqOpcombOp怎么寫呢?而combOp又是啥意思呢诡宗?
我們將seqOp寫為:

(x, y) => (x._1 + y, x._2 + 1)

這啥意思滔蝉?
在講到reduce()函數(shù)的時(shí)候我說:

val l = List(1,2,3,4)
l.reduce((x, y) => x + y)

對(duì)于這個(gè)x,它代指的是返回值塔沃,而y是對(duì)rdd各元素的遍歷蝠引。
aggregate()這也一樣,x不是返回值嗎,我返回值是(Int, Int)啊立肘,它有兩個(gè)元素啊边坤,我可以用x._1x._2來代指這兩個(gè)元素的名扛,y不是rdd的元素遍歷嗎谅年,那我x._1 + y就是各個(gè)元素的累加和啊,x._2 + 1就是元素計(jì)數(shù)啊肮韧。遍歷完成后返回的(Int, Int)就是累加和和元素計(jì)數(shù)啊融蹂。
按理說有這么一個(gè)函數(shù)就應(yīng)該結(jié)束了,后邊那個(gè)combOp是干嘛的弄企?
因?yàn)槲覀兊挠?jì)算是分布式計(jì)算超燃,這個(gè)函數(shù)是將累加器進(jìn)行合并的。
例如第一個(gè)節(jié)點(diǎn)遍歷1和2, 返回的是(3, 2)拘领,第二個(gè)節(jié)點(diǎn)遍歷3和4, 返回的是(7, 2)意乓,那么將它們合并的話就是3 + 7, 2 + 2,用程序?qū)懢褪?/p>

(x, y) => (x._1 + y._1, x._2 + y._2)

最后程序是這樣的:

val l = List(1,2,3,4)
r = l.aggregate(0, 0)((x, y) => (x._1 + y, x._2 + 1), (x, y) => (x._1 + y._1, x._2 + y._2))
m = r._1 / r._2.toFload

m就是所要求的均值约素。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末届良,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子圣猎,更是在濱河造成了極大的恐慌士葫,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,454評(píng)論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件送悔,死亡現(xiàn)場(chǎng)離奇詭異慢显,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)欠啤,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,553評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門荚藻,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人洁段,你說我怎么就攤上這事应狱。” “怎么了眉撵?”我有些...
    開封第一講書人閱讀 157,921評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵侦香,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我纽疟,道長(zhǎng)罐韩,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,648評(píng)論 1 284
  • 正文 為了忘掉前任污朽,我火速辦了婚禮散吵,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己矾睦,他們只是感情好晦款,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,770評(píng)論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著枚冗,像睡著了一般缓溅。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上赁温,一...
    開封第一講書人閱讀 49,950評(píng)論 1 291
  • 那天坛怪,我揣著相機(jī)與錄音,去河邊找鬼股囊。 笑死袜匿,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的稚疹。 我是一名探鬼主播居灯,決...
    沈念sama閱讀 39,090評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼内狗!你這毒婦竟也來了怪嫌?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,817評(píng)論 0 268
  • 序言:老撾萬榮一對(duì)情侶失蹤其屏,失蹤者是張志新(化名)和其女友劉穎喇勋,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體偎行,經(jīng)...
    沈念sama閱讀 44,275評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡川背,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,592評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了蛤袒。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片熄云。...
    茶點(diǎn)故事閱讀 38,724評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖妙真,靈堂內(nèi)的尸體忽然破棺而出缴允,到底是詐尸還是另有隱情,我是刑警寧澤珍德,帶...
    沈念sama閱讀 34,409評(píng)論 4 333
  • 正文 年R本政府宣布练般,位于F島的核電站,受9級(jí)特大地震影響锈候,放射性物質(zhì)發(fā)生泄漏薄料。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,052評(píng)論 3 316
  • 文/蒙蒙 一泵琳、第九天 我趴在偏房一處隱蔽的房頂上張望摄职。 院中可真熱鬧誊役,春花似錦、人聲如沸谷市。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,815評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)迫悠。三九已至鹏漆,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間及皂,已是汗流浹背甫男。 一陣腳步聲響...
    開封第一講書人閱讀 32,043評(píng)論 1 266
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留验烧,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,503評(píng)論 2 361
  • 正文 我出身青樓又跛,卻偏偏與公主長(zhǎng)得像碍拆,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子慨蓝,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,627評(píng)論 2 350

推薦閱讀更多精彩內(nèi)容