Pig是一個基於Hadoop的大規模數據分析平臺,它提供的SQL-LIKE語言叫Pig Latin,該語言的編譯器會把類SQL的數據分析請求轉換爲一系列通過優化處理的MapReduce運算。Pig爲複雜的海量數據並行計算提供了一個簡單的操做和編程接口。html
Compare:相比Java的MapReduce API,Pig爲大型數據集的處理提供了更高層次的抽象,與MapReduce相比,Pig提供了更豐富的數據結構,通常都是多值和嵌套的數據結構。Pig還提供了一套更強大的數據變換操做,包括在MapReduce中被忽視的鏈接Join操做。程序員
Pig包括兩部分:編程
Pig內部,每一個操做或變換是對輸入進行數據處理,而後產生輸出結果,這些變換操做被轉換成一系列MapReduce做業,Pig讓程序員不須要知道這些轉換具體是如何進行的,這樣工程師能夠將精力集中在數據上,而非執行的細節上。數據結構
(1)專一于于大量數據集分析;
(2)運行在集羣的計算架構上,Yahoo Pig 提供了多層抽象,簡化並行計算讓普通用戶使用;這些抽象完成自動把用戶請求queries翻譯成有效的並行評估計劃,而後在物理集羣上執行這些計劃;
(3)提供相似 SQL 的操做語法;
(4)開放源代碼;架構
對於開發人員,直接使用Java APIs多是乏味或容易出錯的,同時也限制了Java程序員在Hadoop上編程的運用靈活性。因而Hadoop提供了兩個解決方案,使得Hadoop編程變得更加容易。編程語言
•Pig是一種編程語言,它簡化了Hadoop常見的工做任務。Pig可加載數據、表達轉換數據以及存儲最終結果。Pig內置的操做使得半結構化數據變得有意義(如日誌文件)。同時Pig可擴展使用Java中添加的自定義數據類型並支持數據轉換。分佈式
•Hive在Hadoop中扮演數據倉庫的角色。Hive添加數據的結構在HDFS,並容許使用相似於SQL語法進行數據查詢。與Pig同樣,Hive的核心功能是可擴展的。函數
Pig和Hive老是使人困惑的。Hive更適合於數據倉庫的任務,Hive主要用於靜態的結構以及須要常常分析的工做。Hive與SQL類似促使 其成爲Hadoop與其餘BI工具結合的理想交集。Pig賦予開發人員在大數據集領域更多的靈活性,並容許開發簡潔的腳本用於轉換數據流以便嵌入到較大的應用程序。Pig相比Hive相對輕量,它主要的優點是相比於直接使用Hadoop Java APIs可大幅削減代碼量。正由於如此,Pig仍然是吸引大量的軟件開發人員。grunt
下載pig的壓縮包,這裏使用的是pig-0.11.1版本,已經上傳至了百度網盤中(URL:http://pan.baidu.com/s/1o6IDfhK)工具
(1)經過FTP工具上傳到虛擬機中,能夠選擇XFtp、CuteFTP等工具
(2)解壓縮
tar -zvxf pig-0.11.1.tar.gz
(3)重命名
mv pig-0.11.1 pig
(4)修改/etc/profile,增長內容以下,最後從新生效配置文件source /etc/profile
export PIG_HOME=/usr/local/pig
export PATH=.:$HADOOP_HOME/bin:$PIG_HOME/bin:$HBASE_HOME/bin:$ZOOKEEPER_HOME/bin:$JAVA_HOME/bin:$PATH
進入$PIG_HOME/conf中,編輯pig.properties文件,加入如下兩行內容:
fs.default.name=hdfs://hadoop-master:9000
mapred.job.tracker=hadoop-master:9001
結合本筆記第五篇《自定義類型處理手機上網日誌》的手機上網日誌爲背景,咱們要作的就是經過Pig Latin對該日誌進行流量的統計。該日誌的數據結構定義以下圖所示:(該文件的下載地址爲:http://pan.baidu.com/s/1dDzqHWX)
PS:在使用Pig以前先將該文件上傳至HDFS中,這裏上傳到了/testdir/input目錄中
hadoop fs -put HTTP_20130313143750.dat /testdir/input
(1)首先經過輸入Pig進入grunt,而後使用Load命令將原始文件轉換爲Pig能夠處理的模式:
grunt>A = LOAD '/testdir/input/HTTP_20130313143750.dat' AS (t0:long,
msisdn:chararray, t2:chararray, t3:chararray, t4:chararray, t5:chararray, t6:long, t7:long, t8:long, t9:long, t10:chararray);
(2)經過Pig對指令的解析,幫咱們轉換成爲了MapReduce任務:
(3)經過如下命令能夠查看結果:
grunt>DUMP A;
(1)這裏咱們須要統計的只是手機號以及四個流量數據,所以咱們經過遍歷將A中的部分字段抽取出來存入B中:
grunt> B = FOREACH A GENERATE msisdn, t6, t7, t8, t9;
(2)經過如下命令能夠查看結果:
grunt>DUMP B;
(1)有用信息抽取出來後,看到結果中一個手機號可能有多條記錄,所以這裏經過手機號進行分組:
grunt> C = GROUP B BY msisdn;
(2)經過如下命令能夠查看結果:
grunt>DUMP C;
(1)在對手機號進行分組以後,咱們能夠看到某個手機號對應着多條流量記錄數據,所以繼續使用FOREACH遍歷分組數據,而後對四個流量數據進行彙總,這裏使用了聚合函數SUM():
grunt> D = FOREACH C GENERATE group, SUM(B.t6), SUM(B.t7), SUM(B.t8), SUM(B.t9);
(2)經過如下命令能夠查看結果:
grunt>DUMP D;
(1)在對流量統計完畢以後,結果仍然是在Pig中,這裏就須要對其進行持久化操做,即將結果存儲到HDFS中:
grunt> STORE D INTO '/testdir/output/wlan_result';
(2)經過HDFS Shell查看存儲結果:
hadoop fs -text /testdir/output/wlan_result/part-r-*
(1)yanghuahui,《Hadoop Pig簡介、安裝與使用》:http://www.cnblogs.com/yanghuahui/p/3768270.html
(2)cloudsky,《Hadoop使用(六)Pig》:http://www.cnblogs.com/skyme/archive/2012/06/04/2534876.html
(3)rzhzhz,《Pig與Hive的對比》:http://blog.csdn.net/rzhzhz/article/details/7557607