pig 調試

<1>. Pig簡介 

 pig是hadoop項目的一個拓展項目, 用以簡化hadoop編程(簡化的程度超乎想象啊),並且提供一個更高層次抽象的數據處理能力,同時能夠保持hadoop的簡單和可靠性。

<2>. 安裝pig 

2.1 下載pig:http://apache.etoak.com/pig/pig-0.11.1/pig安裝包

2.2 解壓下載完成的pig安裝包:

 root@ubuntu:/hadoop/hadoop-0.20.2/$ tar zxvf pig-0.11.1.tar.gz 

2.3 設置環境變量

 root@ubuntu:~$ vim /etc/profile 

export JAVA_HOME=/hadoop/jdk1.6.0_27
export PATH=$PATH:$JAVA_HOME/bin
export CLASSPATH=.:$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/rt.jar
export HADOOP_HOME=/hadoop/hadoop-0.20.2
export PIG_HOME=/hadoop/pig-0.11.1
export PATH=$PIG_HOME/bin:$PIG_HOME/conf:$PATH
export PIG_CLASSPATH=/hadoop/pig-0.11.1/conf

這裏需要說明的是pig是能夠運行在兩種模式下:local模式和mapreduce模式,變量HADOOP_CONF_DIR主要是爲了在mapreduce模式下使用。

 爲了使新設置的環境變量生效,使用如下命令:

root@ubuntu:~$ source .bash_profile 
測試一下pig的安裝是否正確:

 root@ubuntu:~$ pig -x local

2013-06-20 02:35:36,145 [main] INFO  org.apache.pig.Main - Apache Pig version 0.11.1 (r1459641) compiled Mar 22 2013, 02:13:53
2013-06-20 02:35:36,146 [main] INFO  org.apache.pig.Main - Logging error messages to: /hadoop/pig-0.11.1/pig_1371720936115.log
2013-06-20 02:35:36,609 [main] INFO  org.apache.pig.impl.util.Utils - Default bootup file /root/.pigbootup not found
2013-06-20 02:35:37,286 [main] INFO  org.apache.pig.backend.hadoop.executionengine.HExecutionEngine - Connecting to hadoop file system at: hdfs://ubuntu:8020
2013-06-20 02:35:38,504 [main] INFO  org.apache.pig.backend.hadoop.executionengine.HExecutionEngine - Connecting to map-reduce job tracker at: ubuntu:8021
grunt> 

此時表明pig已經正確安裝。

<3>. Pig實戰 

在pig下載的安裝包,解壓完成了之後,有一個tutorial目錄,我們使用裏面的數據來開始pig學習。如果tutorial目錄下沒有存在pigtutorial.tar.gz文件的話,那麼需要使用ant來編譯出這個文件:

root@ubuntu:~/hadoop/src/pig/pig-0.8.1$ ant

這時ant將會下載依賴的jar的文件,同時將編譯出對應版本的pig jar文件。然後進入tutorial目錄,執行ant命令:

root@ubuntu:/hadoop/pig-0.11.1#$ cd tutorial/

root@ubuntu:/hadoop/pig-0.11.1#/tutorial$ ant
這時將生成pigtutorial.tar.gz文件,解壓該文件形成pigtmp的文件夾。該文件夾結構:

 .

|-- excite-small.log
|-- excite.log.bz2
|-- pig.jar
|-- script1-hadoop.pig
|-- script1-local.pig
|-- script2-hadoop.pig
|-- script2-local.pig
`-- tutorial.jar
1 directory, 9 files

在HDFS裏面創建excit-small.log

1. root@ubuntu:/hadoop/hadoop-0.20.2/bin# ./hadoop fs -mkdir /pigdata

2. root@ubuntu:/hadoop/hadoop-0.20.2/bin#  ./hadoop fs -put /hadoop/pig-0.11.1/tutorial/pigtmp/excite-small.log /pigdata

我們下面將主要分析excite-small.log文件,該文件的數據結構如下:

UserIDTimeStampSearchQuery

我們首先將excite-small.log加載到一個變量(也稱之爲alias)中,我們將使用該變量來表示這個數據集:

grunt> log = load 'excite-small.log' as (user, time, query);

注意的是這時pig並沒有運行該命令,僅僅是解析了該命令,只有到使用dump命令或者是store命令時pig纔會真正執行該命令。dump命令將打印出這個變量的內容,store命令將變量所代表的內容保存到一個文件中。

這時如果想要查看該log的結構:

 grunt> describe log;

log: {user: bytearray,time: bytearray,query: bytearray}

這是如果我們想要查看該log文件的前4行的話:

grunt> lmt = limit log 4;

grunt> dump lmt;  

這時將打印出log文件的前四行數據。 

<4>. 深入pig 

4.1 Utility and file commands

 

4.2 Data read/write operators 

 

4.3 Diagnostic operators診斷操作

 

4.4 Data type and schemes

 pig中有6個基本數據類型和3個複合數據類型,基本數據類型如下:

 

複合數據類型: 

pig中數據模型中能夠允許數據類型的嵌套,類似於xml/json格式。

4.5  Expression and functions

pig能夠支持常見運算符。

 

同時在pig中提供了一些內建函數。

 

這裏我們沒有給出示例,將在下面給出示例。 

4.6 Retional operators

首先編寫兩個數據文件A:

0,1,2

1,3,4

數據文件B:

0,5,2

1,7,8
運行pig:

 root@ubuntu:~/hadoop/pig-0.11.1/tutorial/pigtmp$ pig -x local

2013-06-20 02:35:36,145 [main] INFO  org.apache.pig.Main - Apache Pig version 0.11.1 (r1459641) compiled Mar 22 2013, 02:13:53
2013-06-20 02:35:36,146 [main] INFO  org.apache.pig.Main - Logging error messages to: /hadoop/pig-0.11.1/pig_1371720936115.log
2013-06-20 02:35:36,609 [main] INFO  org.apache.pig.impl.util.Utils - Default bootup file /root/.pigbootup not found
2013-06-20 02:35:37,286 [main] INFO  org.apache.pig.backend.hadoop.executionengine.HExecutionEngine - Connecting to hadoop file system at: hdfs://ubuntu:8020
2013-06-20 02:35:38,504 [main] INFO  org.apache.pig.backend.hadoop.executionengine.HExecutionEngine - Connecting to map-reduce job tracker at: ubuntu:8021
grunt> 

加載數據A:

 grunt> a = load 'A' using PigStorage(',') as (a1:int, a2:int, a3:int);

加載數據B:

 grunt> b = load 'B' using PigStorage(',') as (b1:int, b2:int, b3:int);

求a,b的並集:

grunt> c = union a, b;

 grunt> dump c;    

(0,5,2)

(1,7,8)
(0,1,2)
(1,3,4)

將c分割爲d和e,其中d的第一列數據值爲0,e的第一列的數據爲1($0表示數據集的第一列):

grunt> split c into d if $0 == 0, e if $0 == 1;

查看d:

grunt> dump d;   

(0,1,2)

(0,5,2)
查看e:

 (1,3,4)

(1,7,8)

選擇c中的一部分數據:

grunt> f = filter c by $1 > 3;
查看數據f:

 grunt> dump f;

(0,5,2)
(1,7,8)
對數據進行分組:
grunt> g = group c by $2;

查看g:

 grunt> dump g;

 (2,{(0,1,2),(0,5,2)})

(4,{(1,3,4)})
(8,{(1,7,8)})
當然也能夠將所有的元素集合到一起:

 grunt> h = group c all;

grunt> dump h;  

 (all,{(0,1,2),(1,3,4),(0,5,2),(1,7,8)})

查看h中元素個數:

 grunt> i = foreach h generate COUNT($1);

查看元素個數:

grunt> dump i;

這裏可能出現Could not resolve counter using imported: [, org.apache.pig.built in., org.apache.pig.impl.builtin. ]的情況,這是需要使用register命令來註冊pig對應的jar版本。

接下倆試一下jon操作:

grunt> j = join a by $2, b by $2;
該操作類似於sql中的連表查詢,這是的條件是$2 == $2。

取出c的第二列$1和$1 * $2,將這兩列保存在k中:

 grunt> k = foreach c generate $1, $1 * $2;

查看k的內容:

 grunt> dump k; 

 (5,10)

(7,56)
(1,2)
(3,12)

4.7  Working with UDF(user defined function)

pig能夠支持兩種類型的UDFs:eval和load/store,其中load/store的自定義函數主要是用來加載和保存特定的數據格式;eval自定義函數主要用來進行常規的數據轉換。

1. eval

如果想要實現自定義的eval類型的函數,那麼基本的做法是首先編寫一個類繼承自EvalFunc<T>這個抽象類,同時需要重寫這個類的一方法:

abstract public T exec(Tuple input) throws IOException; 

該方法傳入的類型是Tuple類型。

如果調用udf時使用的是:udf(ARG1, ARG2);那麼調用input.get(0)將得到ARG1,同理input.get(1)得到的是ARG2,input.getSize()得到傳遞的參數的數量,這裏就是2.

下面我們就開始編寫udf UPPER.java,將UPPER.java文件保存到myudfs目錄下:

複製代碼
package myudfs;
import java.io.IOException;
import org.apache.pig.EvalFunc;
import org.apache.pig.data.Tuple;
import org.apache.pig.impl.util.WrappedIOException;

public class UPPER extends EvalFunc<String>
{
    
public String exec(Tuple input) throws IOException {
        
if (input == null || input.size() == 0)
            
return null;
        
try{
            String str 
= (String)input.get(0);
            
return str.toUpperCase();
        }
catch(Exception e){
            
throw WrappedIOException.wrap("Caught exception processing input row ", e);
        }
    }
}
複製代碼

編譯該文件,同時生成該jar文件:

root@ubuntu:/hadoop/pig-0.11.1/myudfs$ javac -cp ../pig.jar UPPER.java

root@ubuntu:/hadoop/pig-0.11.1/myudfs$ cd ..

root@ubuntu:/hadoop/pig-0.11.1$ jar -cf myudfs.jar myudfs
準備student_data文件:
student1,1,1
studetn2
,2,2
student3
,3,3
student4
,4,4

 在pig中測試該udf:

xuqiang@ubuntu:/hadoop/pig-0.11.1$ pig -x local

註冊該udf:

grunt> register myudfs.jar

加載數據: 

grunt> A = load 'student_data' using PigStorage(',') as (name:chararray, age:int,gpa:double);
grunt> B = FOREACH A GENERATE myudfs.UPPER(name);
grunt> dump B;
這時將輸出:

(STUDENT1)
(STUDETN2)
(STUDENT3)
(STUDENT4)

<5>. 參考資料及代碼下載 

<Hadoop In Action> 

發佈了14 篇原創文章 · 獲贊 0 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章