Pig 基础知识学习(语法)

[color=red][size=medium][b]1:数据类型[/b][/size][/color]
基本类型和复合类型(即由多个基本类型结成的类型)
[b]基本类型:[/b](int,long,float,double,chararray,bytearray)
基本的类型与java中的类型一致
chararray:字符串(String)或字符数组(‘aaa’或'\n'可以表示特殊符号)
bytearray:字节数组(二进制)如java中的byte[]
[b]复杂类型:[/b](map,tuple,Bag)
map:key/value对,key是chararray类型数据,value的类型不台有多种
map常量:['a'#'123','b'#gbz]
tuple:定长,类型任意,有序(可以通过位置得到元素,从0开始)
常量:('a',3)
[color=red][b]Bag:无序的tuple集[/b][/color]
常量:{('a',4),('b')}
bag不须要加载到内存中,它可以变得非常大
NULL值:任何数据类型的数据都可以为null,定义与sql中的null一样

[color=red][size=medium][b]2:模式[/b][/size][/color]
在加载数据时,可以指定数据按什么分割放到一个定义好的类型中,这类型称为模式(类型关系数据库中的表)
例:div = load 'aa.txt' as (name:chararray,age:int); 类型可省
09版本后,不指定类型会把"文件"中 超过部分截掉,如果文件中一行只有一个字段哪么age为null
用户声明的模式可以是pig中的任意类型:如 as (a:int),as (a:map[],b:map[int]) ,as (a:tuple(),b:tuple(X:int,Y:int)) ,as (a:bag{},b:bag{t:(X:int,Y:int)})
加载数据时模式可以省略,套用usIng后的函数的模式,如果数据本身就有模式(如文件中的数据是josn)可以不声明模式
例:mdata = load 'a.txt' using HCatLoader();
模式中的数据类型:
除了可以使用名称进行引用还可以通过位置进行引用,从0开始,用$0表示第一个字段
pig中刚开始不知道字段的类型,它先假定是bytearray类型的,之后会跟据字段所在表达式中的别外字段决定
daily = load 'a.txt'
calcs = foreach daily generate $1 / 10 , $2 * 1.2 , substring($3,1,2),$4 - $5 , $6 > $7

因为$1的除数是整型的,哪么$1也是整型的(如果文件中不是,可以通过转换成int)
因为$2的乘数是double,哪么$2也是double的
$3是chararray类型的,因为substring处理只能是字符类型
$4,$5是double,-只能用于数值类型,为了安全转为double(转为int会丢精度,如果$4,$5确实是浮点)
$6,$7为bytearray,因为>可以用于数值,char,byte等类型
如果两个数据,其中一个没有模式,它们join 后的结果也没有模式
 A = LOAD '/input/in1/ncdc_data.txt' USING PigStorage(':') AS (year:int, temp:int, quality:int);


[color=red][size=large][b]3:类型转换[/b][/size][/color]
pig中的类型强转跟java的一样
所有类型不可以转为bytearray,反过来可以。(复杂类型不可以转换)
用户定义的UDF中不应该返回bytearray

[color=blue][size=large][b]4:语法[/b][/size][/color]
[color=red][b]pig中除了了内置函数(如:load,LOAD)是大小字不敏感的[/b][/color],其它都是大小定敏感的
[b]1):加载数据[/b]
pig默认的加载函数是:pigStorage,它会加载存放在hdfs中并以制表符分割的文件

divs = load '文件|文件夹' using PigStorage(',');    #可以指定参数分割数据,这里是按逗号
divs = load 'a.txt' using HBaseStorage(); #从hbase中加载数据

加载文件夹,可以加载文件夹下的所有文件,也可以使用正则表达式来加载符合条件的文件(支持正则表达式由hdfs决定,hadoop2.0中有【?,*,[acb],[a-z],[^abc],\,{ab,cb}】)
注:using须要在as前面(a = load '/user/root/data/a.txt' using PigStorage(',') as (a:int,b:long,c:int); )
如果文件中‘没有c这列字段’或无法类型转换,在输出时为空白(不是null这个字符)
[b]2)数据的存储[/b]
默认使用pigStorage将结果以制表分割保存到hdfs中
store proc into '/user/root/aa'; #把proc保存到aa目录下
store proc into '/user/root/aa' using pigStorage(','); #可以指定保存的位置和分割方式

[b]3)数据的输出[/b]
dump proc; #可以将proc输出到屏幕上

[b]4)关系操作[/b]
foreach 把数据通过表达式传递给另外一个变量,
a = foreach A generate user,$2 #将A的user字段和第2个字段传递给变量a
a = foreach A generate * ; #*表示所有字段
a = foreach A generate $1..$3; #表示装第二,三,四个字段传递给a
三目运算(b = foreach a generate (2==2?1:4);)
2 == 2 ? 1 : 4 #--返回1
null == 2 ? 1 : 4 #--返回null
2 == 2 ? 1 : 'aaa' #--类型错误 ,冒号两边数据类型要一致


对于map中的数据,使用:map名#'字段名' 来引用,字段名不存在是返回null
对于tuple中的数据,使用:tuple名.字段名|位置 来引用,位置无是返回null,字段名无时报错
为字段命名:
a = foreach A generate $1 as gbz , $3 as b;
[b]Filter:[/b]过滤数据给新变量
格式:c = filter b by $0 matches '^0*';
输出:匹配就源样输出整行,否则不输出
比较操作:基本类型数据可以使用(==,!=,>,>=,<=)
chararray可以使用正则表达式(如:c = filter b by $0 matches '^0*')
可以在布尔操作符使用not,and.or(有短路功能)
任务成null比较都输出空白(null)【c = filter b by $1==null;】
可以使用is null或is not null判断是否为空
[b]Group: [/b][color=red][b]把具有相同键值的数据聚合在一起[/b][/color]
格式:c = group b by $0; (所有字段可用:group b all;)(可对多个字段:c = group b by ($0,$1))
[color=blue][b]输出:以$0为key的包含模式中所有字段的bag[/b][/color]

[b]得到所有key:[/b][color=red][b]d = foreach c generate group;[/b][/color]
[color=red][b]group会触发一个reduce过程,会有数据倾斜(reduce不会同时结束),pig使用组合器来解决数据倾斜[/b][/color](组合器可以降低网络数据传输和写入磁盘的数据量,可以提高效率,用户UDF可以实现组合器)
处理null值方式是把所有key为null放在一起
[b]Order by:[/b]对数据排序,产生一个全排序(对所有数据排序)的结果
格式:
c = order b by $0;   (可以降序:c = order b by $0 desc , $1; )
只有$0降
输出:排好序的数据集(tuple)
不能对map,tuple,bag使用,所有null都最小
会进入一个reducer(它会先采样每个数据块,只取第一行先排序,然后对所有排序)
[b]Distinct:[/b]去重
格式:c = distinct b;
会进入一个reducer
[b]join:[/b]连接两个输入数据(匹配键值相同的数据放在一起,其它的去掉)
格式:c = join b by b1,a by a1; (可以指定多个键:c = join b by (b1,b2),a by (a1,a2);)
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值