5行代碼怎麼實現Hadoop的WordCount?

初學編程的人,都知道hello world的含義,當你第一次從控制檯裏打印出了hello world,就意味着,你已經開始步入了編程的大千世界,這和第一個吃螃蟹的人的意義有點類似,雖然這樣比喻並不恰當。 

如果說學會了使用hello world就代表着你踏入了單機編程的大門,那麼學會在分佈式環境下使用wordcount,則意味着你踏入了分佈式編程的大門。試想一下,你的程序能夠成百上千臺機器的集羣中運行,是不是一件很有紀念意義的事情呢?不管在Hadoop中,還是Spark中,初次學習這兩個開源框架做的第一個例子無疑於wordcount了,只要我們的wordcount能夠運行成功,那麼我們就可以大膽的向後深入探究了。 


扯多了,下面趕緊進入正題,看一下,如何使用5行代碼來實現hadoop的wordcount,在Hadoop中如果使用Java寫一個wordcount最少也得幾十行代碼,如果通過Hadoop Streaming的方式採用Python,PHP,或C++來寫,差不多也得10行代碼左右。如果是基於Spark的方式來操作HDFS,在採用Scala語言,來寫wordcount,5行代碼也能搞定,但是如果使用spark,基於Java的api來寫,那麼就臃腫了,沒有幾十行代碼,也是搞不定的。 


今天,散仙在這裏既不採用spark的scala來寫,也不採用hadoop streaming的python方式來寫,看看如何使用我們的Pig腳本,來搞定這件事,測試數據如下: 

Java代碼  收藏代碼

  1. i am hadoop  

  2. i am hadoop  

  3. i am lucene  

  4. i am hbase  

  5. i am hive  

  6. i am hive sql  

  7. i am pig  


Pig的全部腳本如下: 

Pig代碼  收藏代碼

  1. --大數據交流羣:376932160(廣告勿入)  

  2. --load文本的txt數據,並把每行作爲一個文本  

  3. a = load '$in' as (f1:chararray);  

  4. --將每行數據,按指定的分隔符(這裏使用的是空格)進行分割,並轉爲扁平結構  

  5. b = foreach a generate flatten(TOKENIZE(f1, ' '));  

  6. --對單詞分組  

  7. c = group b by $0;  

  8. --統計每個單詞出現的次數  

  9. d = foreach c generate group ,COUNT($1);  

  10. --存儲結果數據  

  11. stroe d into '$out'  


處理結果如下: 

Java代碼  收藏代碼

  1. (i,7)  

  2. (am,7)  

  3. (pig,1)  

  4. (sql,1)  

  5. (hive,2)  

  6. (hbase,1)  

  7. (hadoop,2)  

  8. (lucene,1)  


是的,你沒看錯,就是5行代碼,實現了數據的讀取,分割,轉換,分組,統計,存儲等功能。非常簡潔方便! 

除了spark之外,沒有比這更簡潔的,但這僅僅只是一個作業而已,如果在需求裏面,又加入了對結果排序,取topN,這時候在pig裏面,還是非常簡單,只需新加2行代碼即可,但是在spark裏面,可能就需要數行代碼了。 

我們看下,更改之後的pig代碼,加入了排序,取topN的功能: 

Pig代碼  收藏代碼

  1. --load文本的txt數據,並把每行作爲一個文本  

  2. a = load '$in' as (f1:chararray);  

  3. --將每行數據,按指定的分隔符(這裏使用的是空格)進行分割,並轉爲扁平結構  

  4. b = foreach a generate flatten(TOKENIZE(f1, ' '));  

  5. --對單詞分組  

  6. c = group b by $0;  

  7. --統計每個單詞出現的次數  

  8. d = foreach c generate group ,COUNT($1);  

  9. -- 按統計次數降序  

  10. e = order d by $1 desc;  

  11. --取top2  

  12. f = limit e 2;  

  13. --存儲結果數據  

  14. stroe f into '$out'  


輸出結果如下: 

Java代碼  收藏代碼

  1. (i,7)  

  2. (am,7)  



如果使用JAVA來編寫這個MapReduce作業,後面的排序統計topn,必須得重新寫一個job來執行,因爲MapReduce乾的事非常簡單,一個job僅僅只處理一個功能,而在Pig中它會自動,幫我們分析語法樹來構建多個依賴的MapReduce作業,而我們無須關心底層的代碼實現,只需專注我們的業務即可。 

除此之外,Pig還是一個非常靈活的批處理框架,通過自定義UDF模塊,我們可以使用Pig來幹很多事,看過散仙的上一篇文章的朋友們,應該就知道當初雅虎公司不僅僅使用Pig分析日誌,搜索內容,PangeRank排名,而且還使用Pig來構建它們的web倒排索引等種種擴展功能,我們都可以通過Pig的UDF的方式來實現,它可以將我們的業務與MapReduce具體的實現解耦,而且複用性極強,我們寫的任何一個工具類,都可以輕而易舉的通過Pig穩定的運行在大規模的Hadoop集羣之上。 




掃碼關注微信公衆號:我是攻城師(woshigcs),如果有什麼疑問,技術問題,職業問題等,歡迎在公衆號上留言與我探討!讓我們做不一樣的攻城師!謝謝大家!  

3214000f-5633-3c17-a3d7-83ebda9aebff.jpg 


轉載請註明原創地址,謝謝配合!http://qindongliang.iteye.com/ 


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章