基礎概念:
relation bag tuple field data
關系(relation) = 包(bag)
一個包是一個元組(tuple)的集合,在pig中用{}擴起來表示一個包
一個元組(tuple)是若干個字段的有序集合(order set),在pig的數據結構中,用()擴起來標識一個元組
一個字段(field)是列數據(data)的標識;
和數據庫的對應關系:
pig database
relation/bag table
tuple one record
field field(one volume)
但是pig中tuple的字段數是隨意的,這點和數據庫不同
運行模式以及注釋:
1、 運行模式
a) 本地
i. pig –x local
b) 集群
i. pig –x mapreduce
ii. 或者pig
c) 批處理命令
i. 將命令批量寫入xx.pig
ii. 用本地或者集群模式運行,如pig xx.pig
2、注釋
a) 段落注釋:/**/
b) 行注釋: --
基本用法框架:
a) 輸入
i. A = Load ‘輸入路徑’ USING PigStorage(“\t”) AS (name:chararray, age:int, gpa:float);
ii. 邏輯:用pig自帶的PigStorage讀入輸入路徑的數據,對每一行用”\t”分割,並用字符串類型的name、int類型的age、float類型的gpq作為每行數據的字段名
b) 中間處理
i. B = FOREACH A GENERATE name;
c) 輸出
i. DUMP B; --輸出到控制台
ii. 或者STORE B INTO ‘輸出路徑’ USING PigStorage();
基本語法實例:
1、計算多維度組合下的平均值 的實際例子
需求:求文件中第2、3、4組合的第4、5列的平均值
腳本解釋:
A = Load '1.txt' USING PigStorage(' ') AS(col1:chararray, col2:int, col3:int, col4:int, col5:double, col6:double);
將1.txt中的每行數據用" "分割,然后安裝(col1:chararray, col2:int, col3:int, col4:int, col5:double, col6:double)解析數據,並裝載到每個bag/tuple/filed
col1是每列的別名,如果不指定,在后面可以用$0,$n來索引,但是可讀性較差
A的結構是{col1:chararray, col2:int, col3:int, col4:int, col5:double, col6:double)}
B = GROUP A BY (col2, col3, col4);
對A用col2/col3/col4的組合進行分組,然后按組將每條tuple匯集成一個bag,
B的數據結構是B:{group:(col2,col3,col4),A:bag{:tuple,tuple}}
C = FOREACH B GENERATE group, AVG(col5), AVG(col6);
FOREACH是遍歷每個組中匯集的tuple,並對其用組合函數處理字段
C的結構是C:{group:(col2,col3,col4),double,double}
DUMP C;//單機運行打印調試信息
STORE C INTO “output”;//存儲結果
2、統計行數
A = LOAD '1.txt' USING PigStorage (' ‘) AS(col1:chararray, col2:int, col3:int, col4:int, col5:double, col6:double);
B = GROUP A all;
C = FOREACH B GENERATE COUNT(col2);
DUMP C;
注意:如果col2這一列有NULL,則這一行將不會被統計。
GROUP A all;沒有by關鍵字。
If you want to include NULL values in the count computation, use COUNT_STAR.
3、FLATTEN
同1中的例子,但是C不同
C = FOREACH B GENERATE FLATTEN(group), AVG(col5), AVG(col6);
1中的例子得到的結果結構是(col2, col3, col4),avg1,avg2
但是對group作用FLATTEN后結構變為col2,col3,col4,avg1,avg2;可以看出FLATTEN的作用是解嵌套(un-nest)包或者元組tuple,
4、GROUP的兩點說明:
a)用於GROUP的key如果多於一個字段(正如本文前面的例子),則GROUP之后的數據的key是一個元組(tuple),否則它就是與用於GROUP的key相同類型的東西
b)GROUP后得到的結果是一個包或者是relation,其包含的每一個tuple中包含兩個字段,第一個字段被命名為'group',第二個字段是一個包,是含有group對應值的所有tuple的set
5、把數據作為tuple來加載
語法:A = LOAD '1.txt' AS (T: tuple(col1:chararray, col2:int, col3:int,col4:int, col5:double, col6:double);
用describe A;可以查看A的結構。
注意:輸入的數據必須是(xx,xx,xx...xx)的結構才能以元組的形式被加載,適用於中間結果的進一步處理
6、計算多維組合中不重復記錄的條數
C = FOREACH B GENERATE (D = DISTINCT col5; group, COUNT(D));
說明:distinct后跟一個字段即可,如果這個字段不同,則肯定不重復,而如果重復,此字段肯定相同,而且重命名D要用等號,后面跟;
7、將relation轉為表量scalar
8、在pig中使用shell腳本進行輔助處理
A = LOAD ‘2.txt' AS (col1:int, col2:int, col3:int, col4:chararray, col5:int);
B = STREAM A THROUGH `awk '{if($4 == "=") print $1"\t"$2"\t"$3"\t"999"\t"$5; else print $0}'`;
DUMP B;
作用:將第4列中的"="換成999
9、向pig腳本傳參:
語法:pig -param output_dir="/xxx" xxx.pig;
而在xxx.pig中STORE D INTO ‘$output_dir’;
10、COGROUP的作用:
對兩個關系中的包,分別按制定的字段進行分組
A = LOAD '3.txt' AS (acol1:chararray, acol2:int, acol3:int);
B = LOAD '4.txt' AS (bcol1:int, bcol2:chararray, bcol3:int);
C = COGROUP A BY A.acol1, B BY B.bcol2;
DUMP C;
結果的結構{key,{A's one tuple or null},{B's ont tuple or null}};
按A的第一行和B的第二行的值,分別對A、B進行分組組合,如果A中的tuple含有此key則顯示在結果中,如果沒有則為{},B也一樣
11、piggybank
自定義函數的名稱為piggybank
12、UDF的構造函數會被調用多次,所以在其中做一次工作時要特別小心
13、LOAD多個目錄下的數據
LOAD '/data/201{1,2}'
load/data/2011 /data/2012兩個目錄下的數據
14、GROUP 函數不會忽略NULL值,而COUNT會
15、統計某些字段組合的種數:
A = LOAD '15.txt' AS (col1:int, col2:int);
B = GROUP A BY (col1, col2);
C = GROUP B ALL;
D = FOREACH C GENERATE COUNT(B);
DUMP D;
思路:先根據需求對數據進行分組,然后對分組COUNT;
注意:
a)D中COUNT的是B,因為通過C將所有的數據組為一個新的關系,只包含一個tuple,第一個字段為ALL,第二個字段是B的所有tuple組成的一個bag。
b)COUNT作用的對象必須是一個bag,所以在統計字段前,要用GROUP X ALL,將X中所有的tuple組成一個bag
16、兩個整數相除,如何得到一個float
A = LOAD '16.txt' AS (col1:int, col2:int);
B = FOREACH A GENERATE (float)col1/col2;
DUMP B;
注意先轉型在計算,而不是(float)(col1/col2);
17、UNION兩個數據進行統計
A = LOAD '1.txt' AS (col1:int, col2:int);
B = LOAD '2.txt' AS (col3:int, col4:int);
C = UNION A, B;
D = GROUP C BY $0;
E = FOREACH D GENERATE group, SUM(C.$1);
#E = FOREACH D GENERATE FLATTEN(group), SUM(C.$1);
DUMP E;
注意:
UNION操作是給關系添加新的tuple,而且UNION后注意觀測filed的引用方法,見結構篇
多個關系時,對列的操作要指定關系名
18、正則表達式過濾
過濾出符合*//*.qq.com/*的url
A = LOAD '18.txt' AS (col1:int, col2:chararray);
B = FILTER A BY col2 matches '.*//.*\\.qq\\.com/.*';
說明:.*標識至少一個字符
而匹配.字符要進行轉義\.,而在''內轉義要用兩個\\. ;
19、截取字符串:
SUBSTRING(col1, 0, 4):0為startIndex,4為stopIndex,不包含stopIndex;
A = LOAD '19.txt' AS (dataStr:chararray, col2:chararray);
B = FOREACH A GENERATE SUBSTRING(dataStr,0,4);
C = DISTINCT B;
DUMP C;
20、連接字符串:
A = LOAD ‘20.txt' AS (col1:chararray, col2:int);
B = FOEACH A GENERATE CONCAT(col1, (chararray)col2);
DUMP B;
注意:連接的字段類型必須是chararray,如果不是要轉型
嵌套使用:CONCAT(A,CONCAT(B,C);
21、用JOIN求兩個數據集的交集&不同數據類型交集會失敗
A = LOAD '211.txt' AS (a:int);
B = LOAD '212.txt' AS (b:int);
C = JOIN A BY a, B BY b;
D = GROUP C ALL;
E = FOREACH D GENERATE COUNT(C);
DUMP E;
JOIN后C的結構為:C:{A::a:int, B::b:int}
去重:
A = LOAD '211.txt' AS (a:int);
B = LOAD '212.txt' AS (b:int);
C = JOIN A BY a, B BY b;
uniq_C = DISTINCT(C);
D = GROUP uniq_C ALL;
E = FOREACH D GENERATE COUNT(C);
DUMP E;
22、三目運算符使用必須使用():用來替換空值
B = FOREACH A GENERATE ((col1 is null) ? -1 : col1)
23、如何在得到計算結果后,補齊空白
A = LOAD ‘23.txt' AS (col1:int, b:tuple(col2:int, col3:int);
B = FOREACH A GENERATE col1, FLATTEN(b);
C = GROUP B BY B.col1;
D = FOREACH C GENERATE group, SUM(B.col1) AS sum;
E = FOREACH D GENERATE group, ((sum is null) ? 0 : sum);
DUMP E;
24、DISTINCT操作用於去重,正因為它要把數據集合到一起,才知道哪些數據是重復的,因此,它會產生reduce過程。同時,在map階段,它也會利用combiner來先去除一部分重復數據以加快處理速度。
25、提高Pig job的優先級:set job.priority HIGH;提高Pig job的運行速度
26、“Scalars can be only used with projections”錯誤和嵌套/inner FOREACH
在第一列的每種組合中,第二列為3/6的數據分別有多少條
A = LOAD ’26.txt' AS (col1:chararray, col2:int);
B = GROUP A BY col1;
C = FOREACH B {
D = FILTER A BY col2 == 3;
E = FILTER A BY col2 == 6;
GENERATE group, COUNT(D), COUNT(E);};
DUMP C;
27、在grunt模式下按Ctrl+A 和 Ctrl+E 代替 HOME 和 END,就可以跳到行首和行末了
28、同一個關系進行JOIN連接必須導入兩次,做連接,否則出錯
29、外鏈接JOIN
LEFT:左邊的數據全量顯示
A = LOAD '291.txt' AS (col1:int, col2:chararray);
B = LOAD '292.txt' AS (col1:int, col2:chararray);
C = JOIN A BY col1 LEFT, B BY col1;
DESCRIBE C;
DUMP C;
這個和數據庫的左右連接和內鏈接一致
30、pig中支持過濾中文,但是在交互模式下不行
31、統計 tuple 中的 field 數,bag 中的 tuple 數,map 中的 key/value 組數用SIZE函數
32、字符此為null 用col is null來判斷,但是不能過濾" "," " 過濾要用SIZE(xx)>0
FILTER A BY (col1 is not null AND (SIZE(col2) > 0));
33、Pig中的各operator(操作符),哪些會觸發reduce過程
GROUP:由於GROUP操作會將所有具有相同key的記錄收集到一起,所以數據如果正在map中處理的話,就會觸發shuffle→reduce的過程。
ORDER:由於需要將所有相等的記錄收集到一起(才能排序),所以ORDER會觸發reduce過程。同時,除了你寫的那個Pig job之外,Pig還會添加一個額外的M-R job到你的數據流程中,因為Pig需要對你的數據集做采樣,以確定數據的分布情況,從而解決數據分布嚴重不均的情況下job效率過於低下的問題。
DISTINCT:由於需要將記錄收集到一起,才能確定它們是不是重復的,因此DISTINCT會觸發reduce過程。當然,DISTINCT也會利用combiner在map階段就把重復的記錄移除。
JOIN:JOIN用於求重合,由於求重合的時候,需要將具有相同key的記錄收集到一起,因此,JOIN會觸發reduce過程。
LIMIT:由於需要將記錄收集到一起,才能統計出它返回的條數,因此,LIMIT會觸發reduce過程。
COGROUP:與GROUP類似(參看本文前面的部分),因此它會觸發reduce過程。
CROSS:計算兩個或多個關系的叉積。
34、如何統計一個字符串中包含的指定字符數
shell 腳本 awk -F ":" '{print NF - 1}'
以:分割字符串,然后打印總的volume數
原文:http://www.cnblogs.com/uttu/archive/2013/02/19/2917438.html
本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。