加载:
pig默认使用pigStora 函数加载 HDFS中的文件
默认的路径为当前用户的HDFS用户目录:/user/yourlogin
当然也可以指定完整的路径hdfs://localhost/data/filename
使用using指定用户指定的加载函数
可以指定参数,指定分隔符
divs = load 'filename' using pigStorage(',');--使‘,’作为分隔符,默认使用制表符!
可以指定文件夹,则文件夹下的所有会被加载
可使用任意模式,加载匹配模式的文件
输出:
使用store会将处理后的数据写到指定文件
默认使用pigstrae函数,可传入参数表示分隔符,默认制表符
可以使用using指定输出函数
dump可以用来将结果打印到屏幕
foreach:
每个foreach产生的结果都是一个新的tuple
如果为新tuple中,如果为直接投射,未经过如加减等操作,会依据之前的字段名称,推断名称(即复制名称),否则无名称
可以使用as 赋新名称
filter:
过滤数据,讲判别式为真的数据保留
可以使用正则表达式,pig使用java的正则表达式!用 match关键字
可以使用 + ,- ,> , < ,>= ,<=
可以多个断言,用and or not一起使用,使用规则与c中的 && || 一致
对null 会抵消,即x==null x+null 返回null,filter只通过 true的值
用is null判断是否为null
group:
将数据以特定的一列或几列,作为键值,相同的键值聚集到一起
每一条数据的形式为(group:tuple, 被grop关系名:{})
group会触发shuffle过程!
所有null键值会聚集到一起!
orderby:
orderby 按照指定一个或者多个键经行排序,对多个部分的文件,保证第n个文件的键值小鱼第n-1个
默认使用升序,使用desc按照降序排列,desc支队最接近其的键值起作用,其他键值依然是升序!
chararry字典序,bytearray按字节的字节组成的串以字典序排列!
null永远是最小的
group后的数据,会造成数据倾斜,order会使用均衡器,先采样,再分割!------>会导致同一键值的分配到多个reducer(mapreducer 默认的同一键值的在同一reducer里)
distinct
join
limit
sample
parallel:
告知触发reduce的在操作,使用多少个redue,只对使用的语句的相关操作,起作用
可以使用set default parallel 10;设置指定当前脚本的指定的reduce数量
注册UDF:
在pig中总体来说有2种注册UDF的方式,一种是使用命令行,另一种是在脚本中直接使用register
命令行:
define:
使用define useName xx.xx.xxx.f()
则可以直接使用useName 而不需要使用包名
构造函数参数??,返回对象??
pig指令:pig -Dudf.import.list = xx.xx.xx.jar register.pig, 则可以在所有的脚本中使用xx.jar中定义的UDF不需要使用长串的包名
注册命令:
脚本中写:
- 直接register 'path/xx.jar',使用时加上jar的包名+UDF名
- pig会吧xx.jar打到Hadoop运行时需要的jar包中
注册jython中,定义的UDF:
- 使用register ‘xx.py’ using jython as fieldName;
- xx.py必须在当前用户目录下
- using jython 表示是使用Python写的,pig不知道,UDF用神马写
- as fieldName 为UDF确定一个域名,通过fieldName.fu() 调用UDF
- pig不会追踪Python运行所需的模块,要确保所欲的模块都在pig的运行环境中
调用静态java函数:
- define useName InvokeForXX(包名.类名.方法名, 参数)
- 函数返回类型只能是int,long,float,double,String类型
- 参数只能是 int,long ,float,double,string ,array类型
- pig不支持对返回类型进行重载,so需指定InvolkeForXX,XX -->INT,LONG
-
函数为数组,pig会包装成bag传入
传入数组: