初學編程的人,都知道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
i am hadoop sql
i am hadoop 編程
i am lucene api
i am hbase 微信
i am hive 框架
i am hive sql 分佈式
i am pig ide
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/