這篇文章主要講解了“Reduce統(tǒng)計(jì)結(jié)果匯總混亂怎么辦”,文中的講解內(nèi)容簡(jiǎn)單清晰,易于學(xué)習(xí)與理解,下面請(qǐng)大家跟著小編的思路慢慢深入,一起來研究和學(xué)習(xí)“Reduce統(tǒng)計(jì)結(jié)果匯總混亂怎么辦”吧!
成都地區(qū)優(yōu)秀IDC服務(wù)器托管提供商(創(chuàng)新互聯(lián)建站).為客戶提供專業(yè)的IDC機(jī)房托管,四川各地服務(wù)器托管,IDC機(jī)房托管、多線服務(wù)器托管.托管咨詢專線:13518219792
在hadoop2.7.1上寫了一段MapReduce程序,做一個(gè)word cloud統(tǒng)計(jì),程序執(zhí)行結(jié)果中有數(shù)據(jù),但是混亂:很多完全相同的關(guān)鍵字沒有歸并到一起,也有個(gè)別的歸并到了一起,但匯總值沒有超過2的,如下:
中國(guó)紅 1
中國(guó)紅 1
中國(guó)紅 1
摩卡黑 2
摩卡黑 2
百度說,其他同仁遇到的大多是reduce沒有輸出結(jié)果,其原因是Reduce應(yīng)該用Iterable還是Iterator造成的,而且還是0.19和0.20版本時(shí)代的問題。而我有結(jié)果輸出,只是沒有完全執(zhí)行合計(jì)。Reduce代碼如下:
static class MyReducer extends Reducer{ LongWritable result = new LongWritable(); public void reduce(Text key, Iterable values, Context context) throws IOException, InterruptedException { int sum = 0; for (IntWritable val : values) { sum += val.get(); } result.set(sum); context.write(key, result); } }
莫非對(duì)Reduce處理中文Key有問題?不太可能。遂將所有Key用URLEncoder轉(zhuǎn)碼,結(jié)果仍然一樣,不能歸并。查半天,未果。
一覺醒來,忽然發(fā)現(xiàn)程序import中竟然還有IntWritable,我曾經(jīng)把所有Int改成了LongWritable,這個(gè)程序竟然漏了!看上面代碼中Class定義中使用了LongWritable,計(jì)算的時(shí)候卻使用的IntWritable,修改,再運(yùn)行,歸并正常。
原來如此!Map和Reduce的數(shù)據(jù)類型不匹配通常會(huì)有ClassCastException,但LongWritable和IntWritable的轉(zhuǎn)換沒有報(bào)異常,默默的計(jì)算錯(cuò)了,竟然!
感謝各位的閱讀,以上就是“Reduce統(tǒng)計(jì)結(jié)果匯總混亂怎么辦”的內(nèi)容了,經(jīng)過本文的學(xué)習(xí)后,相信大家對(duì)Reduce統(tǒng)計(jì)結(jié)果匯總混亂怎么辦這一問題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是創(chuàng)新互聯(lián),小編將為大家推送更多相關(guān)知識(shí)點(diǎn)的文章,歡迎關(guān)注!