初學編程的人,都知道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腳本,來搞定這件事,測試數據如下:
i am hadoop
i am hadoop
i am lucene
i am hbase
i am hive
i am hive sql
i am pig
Pig的全部腳本如下:
--大數據交流羣:376932160(廣告勿入)
--load文本的txt數據,並把每行作爲一個文本
a = load '$in' as (f1:chararray);
--將每行數據,按指定的分隔符(這裏使用的是空格)進行分割,並轉爲扁平結構
b = foreach a generate flatten(TOKENIZE(f1, ' '));
--對單詞分組
c = group b by $0;
--統計每個單詞出現的次數
d = foreach c generate group ,COUNT($1);
--存儲結果數據
stroe d into '$out'
處理結果如下:
(i,7)
(am,7)
(pig,1)
(sql,1)
(hive,2)
(hbase,1)
(hadoop,2)
(lucene,1)
是的,你沒看錯,就是5行代碼,實現了數據的讀取,分割,轉換,分組,統計,存儲等功能。非常簡潔方便!
除了spark之外,沒有比這更簡潔的,但這僅僅只是一個作業而已,如果在需求裏面,又加入了對結果排序,取topN,這時候在pig裏面,還是非常簡單,只需新加2行代碼即可,但是在spark裏面,可能就需要數行代碼了。
我們看下,更改之後的pig代碼,加入了排序,取topN的功能:
--load文本的txt數據,並把每行作爲一個文本
a = load '$in' as (f1:chararray);
--將每行數據,按指定的分隔符(這裏使用的是空格)進行分割,並轉爲扁平結構
b = foreach a generate flatten(TOKENIZE(f1, ' '));
--對單詞分組
c = group b by $0;
--統計每個單詞出現的次數
d = foreach c generate group ,COUNT($1);
-- 按統計次數降序
e = order d by $1 desc;
--取top2
f = limit e 2;
--存儲結果數據
stroe f into '$out'
輸出結果如下:
(i,7)
(am,7)
如果使用JAVA來編寫這個MapReduce作業,後面的排序統計topn,必須得重新寫一個job來執行,因爲MapReduce乾的事非常簡單,一個job僅僅只處理一個功能,而在Pig中它會自動,幫我們分析語法樹來構建多個依賴的MapReduce作業,而我們無須關心底層的代碼實現,只需專注我們的業務即可。
除此之外,Pig還是一個非常靈活的批處理框架,通過自定義UDF模塊,我們可以使用Pig來幹很多事,看過散仙的上一篇文章的朋友們,應該就知道當初雅虎公司不僅僅使用Pig分析日誌,搜索內容,PangeRank排名,而且還使用Pig來構建它們的web倒排索引等種種擴展功能,我們都可以通過Pig的UDF的方式來實現,它可以將我們的業務與MapReduce具體的實現解耦,而且複用性極強,我們寫的任何一個工具類,都可以輕而易舉的通過Pig穩定的運行在大規模的Hadoop集羣之上。
掃碼關注微信公衆號:我是攻城師(woshigcs),如果有什麼疑問,技術問題,職業問題等,歡迎在公衆號上留言與我探討!讓我們做不一樣的攻城師!謝謝大家!
轉載請註明原創地址,謝謝配合!http://qindongliang.iteye.com/