HIVE-几道经典的hive题目
建表相关语句在此,具体的数据自己制作吧
create table student(Sno int,Sname string,Sex string,Sage int,Sdept string)row format delimited fields terminated by ','stored as textfile; create table course(Cno int,Cname string) row format delimited fields terminated by ',' stored as textfile; create table sc(Sno int,Cno int,Grade int)row format delimited fields terminated by ',' stored as textfile;
第一题:理解distribute by 分区。sort by 和 order by的区别
1.0 查询学生信息,按性别分区,在分区内按年龄有序 select * from student order by sex, sage; set mapred.reduce.tasks=2; select * from student distribute by sex sort by sage; distribute by 是按照指定的字段对数据进行划分到不同的reduce中
第一的语句,我们只是按照性别和年龄排序
第二个,我们设置了2个reduce,并且按照性别分区。sort by sage;
理解sort by和order by的区别。order by是全局排序。而sort by是每个分区内部排序。
95021 周二 男 17 MA
95015 王君 男 18 MA
95005 刘刚 男 18 MA
95011 包小柏 男 18 MA
95004 张立 男 19 IS
95010 孔小涛 男 19 CS
95022 郑明 男 20 MA
95001 李勇 男 20 CS
95016 钱国 男 21 MA
95020 赵钱 男 21 IS
95013 冯伟 男 21 CS
95006 孙庆 男 23 CS
95017 王风娟 女 18 IS
95009 梦圆圆 女 18 MA
95008 李娜 女 18 CS
95014 王小丽 女 19 CS
95018 王一 女 19 IS
95019 邢小丽 女 19 IS
95002 刘晨 女 19 IS
95007 易思玲 女 19 MA
95012 孙花 女 20 CS
95003 王敏 女 22 MA
第二题,理解夺标关联join的使用,注意join的顺序
2.0 查询学生的姓名、课程名称和分数
select student.sname,course.cname,sc.grade from student join sc on student.sno = sc.sno join course on sc.cno = course.cno
join后面跟要连接的表,on后面跟连接的条件。
on和where是不同的
-on指的连接条件
-where是表链接后,再进一步按照where指定条件筛选
--------------------------------
李勇 数据库 81
李勇 数学 85
李勇 信息系统 88
李勇 操作系统 70
刘晨 数学 90
刘晨 信息系统 80
刘晨 操作系统 71
刘晨 数据结构 60
王敏 数据库 82
王敏 信息系统 90
王敏 数据结构 100
张立 数据库 80
张立 数学 92
张立 操作系统 91
张立 数据结构 70
刘刚 数据库 70
刘刚 数学 92
刘刚 信息系统 99
刘刚 数据处理 87
孙庆 数据库 72
孙庆 数学 62
孙庆 信息系统 100
孙庆 操作系统 59
孙庆 数据结构 60
孙庆 数据处理 98
易思玲 信息系统 68
易思玲 操作系统 91
易思玲 数据结构 94
易思玲 数据处理 78
李娜 数据库 98
李娜 信息系统 89
李娜 数据处理 91
梦圆圆 数学 81
梦圆圆 操作系统 89
梦圆圆 数据处理 100
第三题,请理解on和where的区别
查询选修2号课程且成绩在90分以上的所有学生的姓名和分数 select student.sname, sc.grade from student join sc on student.sno=sc.sno where sc.cno=2 and sc.grade>90;
on和where是不同的
-on指的连接条件
-where是表链接后,再进一步按照where指定条件筛选
上面语句的执行过程如下
1,执行from从student抽取所有数据
2,执行join和sc按照on condition的条件拼接成一个表。不理解的同学,把到此的语句打出来看看拼接后的样子
3,从2已经拼接后的临时表格中,按照where的sc.cno=2 and sc.grade>90;条件筛选数据
4,从3筛选后的数据中select所需要的字段
学习sql理解上面过程是十分重要的,这其实只是单纯的sql和hive没有太大关联。理解这个过程也就理解了。on和where的区别。
第四题,理解左外连接,其实就是sql语法
查询所有学生的姓名,如果在成绩表中有成绩,则输出成绩表中的课程号 select student.sname, sc.cno from student left outer join sc on student.sno = sc.sno;
左向外联接的结果集包括 LEFT OUTER子句中指定的左表的所有行,而不仅仅是联接列所匹配的行。如果左表的某行在右表中没有匹配行,则在相关联的结果集行中右表的所有选择列表列均为空值。