编码规范:
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