Pig实战

参考来源:hadoop实战2


为了能够更好的理解pig,下面给出一个实例,使用Grunt Shell方式进行数据分析。

样例数据

学生表(学号,姓名,性别,年龄,所在系)

对应的数据类型Student(Sno:chararray,Sname:chararray,Ssex:chararray,Sage:int,Sdept:chararray)

201000101:李勇:男:20:计算机软件与理论
201000102:王丽:女:19:计算机软件与理论
201000103:刘花:女:18:计算机应用技术
201000104:李肖:男:19:计算机系统结构
201000105:吴达:男:19:计算机系统结构
201000106:滑可:男:19:计算机系统结构
课程表(课程号,课程名,先修课程号,学分)

对应的数据类型Course(Cno:chararray,Cname:chararray,Cpno:chararray,Credit:int)

01,English,,4
02,Data Structure,05,2
03,Database,02,2
04,DB Design,03,3
05,C Language,,3
06,Principles Of Network,07,3
07,OS,05,3
选课表(学号,课程号,成绩)

对应数据类型SC(Sno:chararray,Cno:chararray,Grade:int)

201000101,01,92
201000101,03,50
201000102,01,90
201000102,02,94
201000102,03,82
201000103,01,35
201000103,02,90
201000104,03,75

一、计算每个学生的平均成绩

我们需要对学生表和选课表进行操作,首先,需要对学生表和选课表基于学号字段进行连接;然后,基于学号对学生数据进行操作,这时需要对每个学生所有的课程成绩分别求和,并除以课程总数;最后,按格式输出。

1.读取数据

首先要将数据上传到HDFS中(put或者copyFromLocal)

A = load 'Tmp/Student' using PigStorge(':') as (Sno:chararray,Sname:chararray,Ssex:chararray,Sage:int,Sdept:chararray);
B = load 'Tmp/SC' using PigStorge(',') as (Sno:chararray,Cno:chararray,Grade:int);
2.连接操作
D = Join A By Sno,B By Sno;
查询D的结果:DUMP D;

(201000101,李勇,男,20,计算机软件与理论,201000101,01,92)
(201000101,李勇,男,20,计算机软件与理论,201000101,03,50)
(201000102,王丽,女,19,计算机软件与理论,201000102,01,90)
(201000102,王丽,女,19,计算机软件与理论,201000102,02,94)
(201000102,王丽,女,19,计算机软件与理论,201000102,03,82)
(201000103,刘花,女,18,计算机应用技术,201000103,01,35)
(201000103,刘花,女,18,计算机应用技术,201000103,02,90)
(201000104,李肖,男,19,计算机系统结构,201000104,03,75)

3.分组操作

E = Foreach D generate A::Sno,Sname,Grade;
F = Cogroup E By (Sno,Sname);
查询F的结果:DUMP F;

((201000101,李勇),{(201000101,李勇,92),(201000101,李勇,50)})
((201000102,王丽),{(201000102,王丽,90),(201000102,王丽,94),(201000102,王丽,82)})
((201000103,刘花),{(201000103,刘花,35),(201000103,刘花,90)})
((201000104,李肖),{(201000104,李肖,75)})

4.计算学生的平均成绩

G = Foreach F Generate group E.Sname,(SUM(E.Grade)/COUNT(E));
查询G 的最终结果:DUMP G;

(李勇,71L)
(王丽,88L)
(刘花,62L)
(李肖,75L)

二、找出成绩不合格的学生

这部分要求找出有不及格成绩的学生,并输出学生的姓名和不及格的课程和成绩

A = load 'Tmp/Student' using PigStorge(':') as (Sno:chararray,Sname:chararray,Ssex:chararray,Sage:int,Sdept:chararray);   --读取学生表
B = load 'Tmp/SC' using PigStorge(',') as (Sno:chararray,Cno:chararray,Grade:int);  --读取选课表
C = load 'Tmp/Course' using PigStorge(',') as (Cno:chararray,Cname:chararray,Cpno:chararray,Ccredit:int);   --读取课程表
D = Filter B By Grade < 60; --提前对B进行分析,过滤出需要的结果,减少操作的数据量
E = Join D By Sno,A By Sno; --连接操作
F = Join E By Cno,C By Cno; --连接操作
G = Foreach F Generate Sname,Cname,Grade; --输出结果

查看结果Dump G

(刘花,English,35)

(李勇,Database,50)


三、找出修了先修课为“C Language”的学生

要求找出修了先修课为“C Language”的学生,并输出学生的姓名

A = load 'Tmp/Student' using PigStorge(':') as (Sno:chararray,Sname:chararray,Ssex:chararray,Sage:int,Sdept:chararray);   --读取学生表
B = load 'Tmp/SC' using PigStorge(',') as (Sno:chararray,Cno:chararray,Grade:int);  --读取选课表
C = load 'Tmp/Course' using PigStorge(',') as (Cno:chararray,Cname:chararray,Cpno:chararray,Ccredit:int);   --读取课程表
D = load 'Tmp/Course' using PigStorge(',') as (Cno:chararray,Cname:chararray,Cpno:chararray,Ccredit:int);   --读取课程表

 
E = Join C By Cpno,D By Cno; --连接数据
F = Filter E By D::Cname == 'C Language'; --过滤出先修课名为C language的记录
G = Foreach F Generate C::Cno;  --找出先修课为C language 课程的课程号
H = Join G By Cno,B By Cno;--选课表和C Language课程的课程号做连接操作
I = Join H By Sno,A By Sno;--选课表与目标课程号连接结果与学生表做连接操作
J = Foreach I Generate Sname;--输出结果
查看结果dump J

(王丽)

(刘花)













评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值