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腳本,來搞定這件事,測試數據以下: 

python

Java代碼  收藏代碼web

  1. i am hadoop  sql

  2. i am hadoop  編程

  3. i am lucene  api

  4. i am hbase  微信

  5. i am hive  框架

  6. i am hive sql  分佈式

  7. i am pig  ide


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/

相關文章
相關標籤/搜索