Pig 讀書筆記 + 工做總結(乾貨不少)

編碼規範:
1. 註釋:     單行:--
     多行或嵌入式: /* */
2. 大小寫:
     關鍵字不區分大小寫,變量名和udf區分大小寫

數據類型:
int, long, float, double, chararray, Bytearray, tuple, bag, map

語法:
     讀取 & 保存 & 參數:
      1. LOAD reads data from the file system
          eg. LOG = LOAD '/user/pig/test'  AS (name:chararray, age:int);
       * 使用 USING PigStorage(',') 指定分隔符是逗號,默認是tab能夠不指定eg中。
       * 使用 USING HBaseStorage() 從HBase導入數據
       * 使用 USING org.apache.pig.piggybank.storage.HiveColumnarLoader('name string, age int') 從hive中導入rcfile文件注意數據類型要用Hive中的,不是pig中的,尤爲是chararray和string不用用混,另外須要引入幾個jar包:
          * register /hadoop/pig/lib/piggybank.jar
          * register /hadoop/pig/lib/hive-exec-0.8.1.jar
          * register /hadoop/pig/lib/hive-common-0.8.1.jar

     2.STORE  writes output to the file system
          eg. STOER LOG into '/user/pig/output';
       * 使用 USING PigStorage(',') 指定輸出數據的分隔符是逗號,默認是tab能夠不指定eg中。
       * 使用 USING HBaseStorage() 存儲到HBase中

     3.DUMP  displays output to the screen
          eg. dump LOG
       * dump壓縮過的文件,而產生亂碼時,設置下:SET mapred.output.compress false

     4. 傳參:python

        eg. pig -p date='2014-05-17' pug_test.pig  #pig腳本中用$date調用
     
     過濾:
     1.FILTER : 按條件刪除行
          eg. FILTER LOG by gender='female'
     2.DISTINCT : 去處重複的行
          eg. DISTINCT (FILTER LOG by gender='male')
     3.FOREACH…GNERATE  : 增長或刪除字段
          eg. FOREACH LOG GENERATE name, age, ((boyfrieds is null)?60:0)
     
     分組和鏈接和抹平:
     1.JOIN:2個或多個錶鏈接
          eg. JOIN A BY aid (LEFT/RIGHT OUTER), B BY bid

       * 默認JOIN是內鏈接
       * 若是某一個表不大能夠使用Using 'replicated',將後面的表放到內存中,可是必定要當心不能超過JVM設定的最大內存,否則會有內存溢出的問題
       * JOIN … LEFY/RIGHT OUTER …. 標準的左鏈接和右鏈接
       * 能夠指定多個字段的JOIN,JOIN A by (aid, a_name), B by (bid, b_name),也能夠考慮用concat(aid, a_name)這種拼接值JOIN來提升效率

     2.GROUP:一個關係中分組  apache

log = load '/tmp/jiankuiwang/tmp/cogroupa.txt' as (name:chararray, age:int, act:chararray);          
g_log = group log by act;                                                                 
describe g_log;
--g_log: {group: chararray,log: {(name: chararray,age: int,act: chararray)}} 
dump g_log;
--(eat,{(liza,22,eat)})  
--(run,{(jack,32,run)}) 
--(mouse,{(tom,20,mouse)})

     3.COGROUP:2+個關係中作分組
          eg. C= COGROUP A BY aid, B by bid
        * 當心aid和bid的空值   
        * 使用OUTER 、 INNER 實現外鏈接和內鏈接

     4.FLATTEN:消除嵌套,將map或者元組抹平。
         數據結構

gf = foreach g_log generate flatten($1);
describe gf;                                          
--gf: {log::name: chararray,log::age: int,log::act: chararray}
dump gf;    
--(liza,22,eat)              
--(jack,32,run)
--(tom,20,mouse)

                          
     5.CROSS:2+個關係的叉乘
     
     排序:
     1.ORDER
     2.LIMIT
     
     合併和分割;
     1.UNION
     2.SPLIT
     
     調試&診斷:
     1.DESCRIBE:描述關係和數據結構
     2.EXPLAIN:打印New Logical Plan,Physical Plan,Map Reduce Plan    
     3.ILLUSTRATE:顯示Logical Plan的試運行結果
     4.PARALLEL : 設置reduce個數

     UDF和STREAM:
     1.REGISTER:註冊Jar文件
          eg. register /hadoop/pig/lib/piggybank.jar
     2.DEFINE:爲UDF,流式腳本或者命令規範新建別名,例子和STREAM一塊兒介紹
     3.STREAM    app

DEFINE app_user_reborn `app_user_reborn.py '$STREAM_FIELDS'` SHIP('$BIN/../udf/app_user_reborn.py','$BIN/../../../jaguar_common/streaming_base.py','$BIN/../../../jaguar_common/string_util.py',
 '$BIN/../udf/IP.csv') OUTPUT (stdout USING PigStreaming('\u0001'));
              APP_ROWS = STREAM LOG THROUGH app_user_reborn AS (device_id, device_token, access_token, imei, macid, device, device_info, user_ids, app, versions, client_ids, network_info, visit_ip, visit_location, start_times, online_time, search_word, total_pv, page_pv, order_list, gmv, province, city, land_page, bounce_page) ;

   * $STREAM_FIELDS 是app_user_reborn.py 的輸入參數
   * SHIP的做用的裝載app_user_reborn.py 腳本中用到的其餘文件,注意:Only files, not directories, can be specified with the ship option。
   * OUTPUT指定app_user_reborn.py 的輸出文件的分隔符


   * 很是重要的一點: PIG 調用python腳本1,python腳本1調用python腳本2, 怎麼實現? 作法:1,ship時傳入2個腳本;2.在腳本1中加入一行sys.path.append(os.getcwd())

oop

相關文章
相關標籤/搜索