pig實戰 pig常用語法總結,教你快速入門——算法篇


基礎概念:
  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

 


注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2020 ITdaan.com