PIG介绍:
Pig是MapReduce的一个抽象。是一个平台/工具,用于分析较大的数据集,并将它们表示为数据流。
Pig包括两部分内容:
(1)用于描述数据流的语言,称为 Pig Latin
(2)用于运行Pig Latin程序的执行坏境,当前有两个环境:单JVM的本地执行坏境 - Hadoop集群的分布式坏境
为什么需要Pig:
不太擅长Java的程序员通常不习惯使用Hadoop(MapReduce),Pig主要是解决该问题的。
Pig 执行模式:
pig -x local 本地模式
pig -x mapreduce MapReduce模式
本地模式在Grunt Shell 界面中,只能使用Linux的命令,不能使用hadoop的命令
在mapreduce下既能用Linux也可以用hadoop命令
执行Linux命令: sh … eg: sh ls /
执行HDFS命令: fs … eg: fs -ls /
Pig Latin 语言:
在使用pig时要将等号和关系、操作符分隔开。
A = LOAD… 而不是A=LOAD
数据类型:int long float double chararray boolean datetime
标识符:用来表示关系的名称(别名)、字段、变量等
读时模式:读取数据过程中严格匹配数据类型
写时模式:写入数据过程中匹配数据类型
原子:Pig
Latin中的任何单个值,无论其数据类型,都称为原子。
Tuple-元组:有序字段集合形成的记录。(关系型数据库中的行类似)
语法: (field,[field,…])
Bag-包:一个包是一组无序的元组(类似关系型数据库中表)
语法:{tuple,[tuple,…]}
Map-映射:映射是一组key-value键值对 key:chararray类型,且是唯一。value:任意类型
语法: [key,value]
Latin中关系是无需的,不能保证按特定顺序处理元组。
Pig Latin中,大小写严格区分,内置关键字大小写不区分,用户自定义函数大小写区分
关系运算符:
LOAD:用于将数据从文件系统加载到关系中
A = LOAD ‘数据文件’ [USING PigStorage(‘分隔符’)] [AS(name:type…)]
STORE:用于将数据从系统存储在文件中
FILTER:从关系中删除不需要行
DISTINCT:从关系中删除重复行
FOREACH,GENERATE:基于数据列生成的数据转换
DUMP:用于显示关系中的数据
JOIN:连接两个或者多个关系
内连接:
B = JOIN RelationA by A_field ,RelationB by B_field;
左外连接:左边有,右边没数据 LEFT OUTER
右外连接:右边有,左边没数据 RIGHT OUTER
全外链接:左右两边数据笛卡尔积查询 FULL OUTER
GROUP:在单个关系中对数据进行分组
OREDER:排序
LIMIT:从关系中获取有限数量的元组
内置函数:AVG() MAX() MIN() COUNT() SUM()
TOKENIZE(): 拆分字段(空格、双引号、逗号、括号、星号)
FLATTEN(): 将包、tuple打开,获取里面的内容
引用关系:关系可以通过名称、位置引用。
位置引用:$0 表示第一个字段
eg1:分隔name age 后age+5
A = LOAD 'data' USING PigStorage('#') AS (name:chararray,age:int);
DUMP A;
B = foreach A generate age+5;
DUMP B;
eg2:
A = LOAD 'data' AS(t1:tuple(t1a:int,t1b:int,t1c:int),t2:tuple(t2a:int,t2b:int,t2c:int));
eg3:求和
文本:
21/32
12/12
11/11
22/22
33/111
A = LOAD 'data' USING PigStorage('/') AS (s1:int,s2:int);
B = foreach A generate s1+s2;
eg4:求平均值
文本:
984815151/1950/05118/0000
984815151/1950/05118/0022
984815151/1950/05118/0011
984815151/1949/05118/0111
984815151/1949/05118/0078
984815151/1937/05118/0001
984815151/1937/05118/0002
Pig Latin:
A = LOAD 'temp' USING PigStorage('/') AS (id:chararray,year:int,flag:chararray,temp:int);
B = GROUP A by year;
C = FOREACH B GENERATE group,AVG(A.temp);
D = FOREACH B GENERATE group,MAX(A.temp); 最大值
eg5:
文本1:
1001,甘宁,文员,1013,2010-12-17,8000.00,20
1002,黛绮丝,销售员,1006,2011-02-20,16000.00,30
1003,殷天正,销售员,1006,2011-02-22,12500.00,30
1004,刘备,经理,1009,2011-04-02,29750.00,20
1005,谢逊,销售员,1006,2011-09-28,12500.00,30
1006,关羽,经理,1009,2011-05-11,28500.00,30
1007,张飞,经理,1009,2011-09-12,24500.00,10
1008,诸葛亮,分析师,1004,2017-04-19,30000.00,20
1009,增阿牛,董事长,2009-11-17,50000.00,10
1010,韦一笑,销售员,1006,2011-06-09,15000.00,30
1011,周泰,文员,1008,2017-05-23,11000.00,20
1012,程普,文员,1006,2017-09-12,9500.00,30
1013,庞统,分析师,1004,2011-12-03,30000.00,20
1014,黄盖,文员,1007,2012-01-23,13000.00,10
1015,张三,保洁员,1001,2013-05-01,80000.00,50
查询上级领导:
Pig Latin:
emp = LOAD 'emp' USING PigStorage(',') AS(id:int,name:chararray,work:chararray,pid:int,time:chararray,sal:double,dept:int);
emp1 = LOAD 'emp' USING PigStorage(',') AS(id:int,name:chararray,work:chararray,pid:int,time:chararray,sal:double,dept:int);
test1 = JOIN emp BY id,emp1 BY pid; result = foreach test1 generate $8,$1
文本2:
10,教研部,北京
20,学工部,上海
30,销售部,广州
40,财务部,武汉
查询部门:
Pig Latin:
dept = LOAD 'dept' USING PigStorage(',') AS (did:int,dname:chararray,loc:chararray);
test2 = JOIN emp by dept,dept by did;
result2 = foreach test2 generate $1,$8
eg6: 词频统计
文本:
hadoop c c++
hello hadoop java hello
c c++
Pig Latin:
A = LOAD 'count' AS(line:chararray);
B = FOREACH A GENERATE TOKENIZE(line); /*拆分*/
C = FOREACH B GENERATE FLATTEN($0); /*打开包,获得全部内容*/
D = GROUP C by $0; /*分组*/
E = FOREACH D GENERATE group,COUNT(C);