<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
root@ubuntu:~$ vim /etc/profile
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
爲了使新設置的環境變量生效,使用如下命令:
root@ubuntu:~$ pig -x local
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
此時表明pig已經正確安裝。
<3>. Pig實戰
在pig下載的安裝包,解壓完成了之後,有一個tutorial目錄,我們使用裏面的數據來開始pig學習。如果tutorial目錄下沒有存在pigtutorial.tar.gz文件的話,那麼需要使用ant來編譯出這個文件:
root@ubuntu:~/hadoop/src/pig/pig-0.8.1$ ant
root@ubuntu:/hadoop/pig-0.11.1#$ cd tutorial/
.
在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);
這時如果想要查看該log的結構:
grunt> describe log;
這是如果我們想要查看該log文件的前4行的話:
grunt> lmt = limit log 4;
這時將打印出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
數據文件B:
0,5,2
root@ubuntu:~/hadoop/pig-0.11.1/tutorial/pigtmp$ pig -x local
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
加載數據A:
grunt> a = load 'A' using PigStorage(',') as (a1:int, a2:int, a3:int);
grunt> b = load 'B' using PigStorage(',') as (b1:int, b2:int, b3:int);
grunt> c = union a, b;
grunt> dump c;
(0,5,2)
將c分割爲d和e,其中d的第一列數據值爲0,e的第一列的數據爲1($0表示數據集的第一列):
grunt> split c into d if $0 == 0, e if $0 == 1;
grunt> dump d;
(0,1,2)
(1,3,4)
選擇c中的一部分數據:
grunt> dump f;
查看g:
grunt> dump g;
(2,{(0,1,2),(0,5,2)})
grunt> h = group c all;
(all,{(0,1,2),(1,3,4),(0,5,2),(1,7,8)})
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操作:
取出c的第二列$1和$1 * $2,將這兩列保存在k中:
grunt> k = foreach c generate $1, $1 * $2;
grunt> dump k;
(5,10)
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目錄下:
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$ cd ..
studetn2,2,2
student3,3,3
student4,4,4
在pig中測試該udf:
xuqiang@ubuntu:/hadoop/pig-0.11.1$ pig -x local
註冊該udf:
加載數據: