世界上最牛逼的人是谁

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子句中指定的左表的所有行,而不仅仅是联接列所匹配的行。如果左表的某行在右表中没有匹配行,则在相关联的结果集行中右表的所有选择列表列均为空值。      

 

posted @ 2017-11-09 12:02  站在浪潮之巅  阅读(6255)  评论(1编辑  收藏  举报