文章出處

pig是hadoop的一個子項目,用于簡化MapReduce的開發工作,可以用更人性化的腳本方式分析數據。

一、安裝

a) 下載

從官網http://pig.apache.org下載最新版本(目前是0.14.0版本),最新版本可以兼容hadop 0.x /1.x / 2.x版本,直接解壓到某個目錄即可。

注:下面是幾個國內的鏡像站點

http://mirrors.cnnic.cn/apache/pig/

http://mirror.bit.edu.cn/apache/pig/

http://mirrors.hust.edu.cn/apache/pig/

本文的解壓目錄是:/Users/jimmy/app/pig-0.14.0

b) 環境變量

export PIG_HOME=/Users/jimmy/app/pig-0.14.0

export HADOOP_HOME=/Users/jimmy/app/hadoop-2.6.0

export PIG_CLASSPATH=${HADOOP_HOME}/etc/hadoop/

export HADOOP_CONF_DIR=${HADOOP_HOME}/etc/hadoop

...

export PATH=${PIG_HOME}/bin:$PATH

至少要配置上面這幾項,其它項比如JAVA_HOME就不必多說了,肯定也是要的。

c) 啟動

$PIG_HOME/bin/pig

如果能正常進入grunt > 提示符就表示ok了

 

二、基本HDFS操作

pig的好處之一是簡化了HDFS的操作,沒有pig之前要查看一個hdfs的文件,必須$HADOOP_HOME/bin/hdfs dfs -ls /input 打一堆命令,而在pig shell交互模式下,只需要

ls /input 即可

 

查看hdfs文件內容

cat /input/duplicate.txt

跟在linux下操作完全一樣,其它命令留著大家自己去研究吧,不熟悉的可以用help查看幫助

 

三、基本的數據分析

在前面的文章 Hadoop: MapReduce2的幾個基本示例 中,我們用JAVA編程的方式演示了幾個基本例子,現在拿pig來實現一把作為對比:

a) 求Count

grunt> a = LOAD '/input/duplicate.txt' AS (value:int);

先將輸入文件加載到a中,由于輸入文件每行只有一個數字,最后的AS部分表示創建了一個列,名稱為value,為整型,其值就是這個數字的值。

可以用describle a; 查看結構,如果要看具體值,可以用dump a;

 

grunt> b = GROUP a all;

對a進行分組,這里由于沒有指定分組條件,所以相當每一行都是分組組件,這一條命令的主要作用是實現行轉列,執行完以后,可以查下b的結構和值:

 

grunt> c = FOREACH b GENERATE COUNT(a.value);

由于b只有一行了,所以上面的語句其實就是求該所有a.value列的個數,即輸入文件的總數。

原來用MapReduce要寫一坨java代碼的工作,現在用PIG只要3條命令就搞定了。

 

b) 求最大值(MAX)

grunt> c = FOREACH b GENERATE MAX(a.value);

 

c) 求平均值(AVG)

grunt> c = FOREACH b GENERATE AVG(a.value);

 

d) 求和(SUM)

grunt> c = FOREACH b GENERATE SUM(a.value);

 

e) 去重復(DISTINCT)

DISTINCT的思路跟前面略有不同,關鍵在于如何分組,見下面的命令:

grunt> b = GROUP a by value; 

對a分組,分組依據為value值,這樣重復的值就歸到一組了,可以用dump b;看下結果:

剩下的事情就好辦了,把b的第一列取出來即可

grunt> c = FOREACH b GENERATE group;

處理完成,用dump c;查看結果

當然,對本例而言,還有一種更簡單的去重方法:
grunt> b = DISTINCT a;

 

f) WordCount

已經有人研究過了,就直接拿來用吧,見:http://blog.itpub.net/26495863/viewspace-1348121/

grunt> a = LOAD '/input/immortals.txt' as (line:chararray); //加載輸入文件,并按行分隔

grunt> words = FOREACH a GENERATE flatten(TOKENIZE(line)) as w; //將每行分割成單詞

grunt> g = GROUP words by w; //按單詞分組

grunt> wordcount = FOREACH g GENERATE group,COUNT(words);  //單詞記數

輸出結果 dump wordcount;

(I,4)
(Of,1)
(am,1)
(be,3)
(do,2)
(in,1)
(it,1)
(of,1)
(to,1)
(we,3)
(But,1)
(all,1)
(are,2)
(bad,1)
(but,1)
(dog,1)
(not,1)
(say,1)
(the,4)
(way,1)
(They,1)
(best,1)
(have,1)
(what,1)
(will,2)
(your,1)
(fever,1)
(flame,1)
(guard,1)
(dreams,1)
(eternal,1)
(watcher,1)
(behavior,1)

 

g) wordcount2(帶詞頻倒排序)

在剛才的示例上修改一下:
a = LOAD '/input/immortals.txt' as (line:chararray);
words = FOREACH a GENERATE flatten(TOKENIZE(line)) as w;
g = GROUP words by w;
前面這幾行都不用改
wordcount = FOREACH g GENERATE group,COUNT(words) as count;//給單詞數所在列加一個別名count
r = foreach wordcount generate count,group;//將結果列交換,將變成{count,word}這種結構

(4,I)
(1,Of)
(1,am)
(3,be)
(2,do)
(1,in)
(1,it)
(1,of)
(1,to)
(3,we)
(1,But)
(1,all)
(2,are)
(1,bad)
(1,but)
(1,dog)
(1,not)
(1,say)
(4,the)
(1,way)
(1,They)
(1,best)
(1,have)
(1,what)
(2,will)
(1,your)
(1,fever)
(1,flame)
(1,guard)
(1,dreams)
(1,eternal)
(1,watcher)
(1,behavior)

g2 = group r by count;//按count分組

(1,{(1,behavior),(1,watcher),(1,eternal),(1,dreams),(1,guard),(1,flame),(1,fever),(1,your),(1,what),(1,have),(1,best),(1,They),(1,way),(1,say),(1,not),(1,dog),(1,but),(1,bad),(1,all),(1,But),(1,to),(1,of),(1,it),(1,in),(1,am),(1,Of)})
(2,{(2,will),(2,are),(2,do)})
(3,{(3,we),(3,be)})
(4,{(4,I),(4,the)})

x = foreach g2 generate group,r.group;//去掉無用的列

(1,{(behavior),(watcher),(eternal),(dreams),(guard),(flame),(fever),(your),(what),(have),(best),(They),(way),(say),(not),(dog),(but),(bad),(all),(But),(to),(of),(it),(in),(am),(Of)})
(2,{(will),(are),(do)})
(3,{(we),(be)})
(4,{(I),(the)})

y = order x by group desc;//按count倒排

(4,{(I),(the)})
(3,{(we),(be)})
(2,{(will),(are),(do)})
(1,{(behavior),(watcher),(eternal),(dreams),(guard),(flame),(fever),(your),(what),(have),(best),(They),(way),(say),(not),(dog),(but),(bad),(all),(But),(to),(of),(it),(in),(am),(Of)})

最后給二個網友整理的pig用法文章地址:

hadoop pig 入門總結 http://blackproof.iteye.com/blog/1791980

pig中各種sql語句的實現 http://www.open-open.com/lib/view/open1385173281604.html


文章列表




Avast logo

Avast 防毒軟體已檢查此封電子郵件的病毒。
www.avast.com


arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()