Hive 基础测试
Posted 保护胖丁
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Hive 基础测试相关的知识,希望对你有一定的参考价值。
准备数据
- 学生表student
学号sid,姓名sname,性别ssex,年龄sage,系 department
95001,李勇,男,20,CS
95002,刘晨,女,19,IS
95003,王敏,女,22,MA
95004,张立,男,19,IS
95005,刘刚,男,18,MA
95006,赵丽,女,20,CS
- 成绩表score
学生编号sid,课程编号cid,成绩sscore
95001,1,81
95001,2,85
95001,3,88
95001,4,70
95002,1,90
95002,2,80
95002,3,90
95002,4,80
95003,1,70
95003,2,78
95003,3,65
95003,4,65
95004,1,70
95004,2,90
95004,3,85
95004,4,90
95005,1,70
95005,2,90
95005,3,70
95005,4,90
95006,1,70
95006,2,90
95006,3,70
95006,4,90
- 课程表course
课程编号cid,课程名cname
1,数据库
2,数学
3,信息系统
4,操作系统
需求1: 创建三个外部表,并分别给外部表加载数据
- student:学号sid,姓名sname,性别ssex,年龄sage,系 department
--建库
create database db_exam;
use db_exam;
--建表
create external table if not exists student(
sid string,
sname string,
ssex string,
sage int,
department string
) row format delimited fields terminated by ',';
--加载
load data local inpath '/export/data/student.txt' into table student;
- score :学生编号sid,课程编号cid,成绩sscore
--建表
create external table if not exists score(
sid string,
cid string,
sscore int
) row format delimited fields terminated by ',';
--加载
load data local inpath '/export/data/score.txt' into table score;
- course:课程编号cid,课程名cname
--建表
create external table if not exists course(
cid string,
cname string
) row format delimited fields terminated by ',';
--加载
load data local inpath '/export/data/course.txt' into table course;
需求2:查询各课的平均成绩,要求对平均成绩降序排序,并且小数保留2位,考虑四舍五入
- step1:先看结果
科目 平均成绩
select 课程,平均成绩 from score
-
step2:有没有行的过滤?
- 有where
-
step3:有没有分组
- group by cid
- 聚合:round(avg(sscore),2)
-
step4:有没有聚合的过滤
- 没有having
-
step5:有没有排序
- order by avgscore desc
select cid,round(avg(sscore),2) as avgscore from score group by cid order by avgscore desc;
需求3: 查询CS系中数学成绩最高的学生的信息,包括学生的学号和名字(考虑成绩相同情况)
- step1:结果
学号 名字
select * from student ;
-
step2:条件
-
CS系:student
-
数学:course
-
成绩:score
-
select
a.sid,
a.sname,
a.department,
b.cid,
b.sscore,
c.cname
from student a join score b on a.sid = b.sid
join course c on b.cid = c.cid
where a.department = 'CS' and c.cname = '数学';
-
考虑成绩相同情况:dense_rank
select sid,sname from ( select a.sid, a.sname, a.department, b.cid, b.sscore, c.cname, dense_rank() over (partition by department,cname order by sscore desc) as rn from student a join score b on a.sid = b.sid join course c on b.cid = c.cid where a.department = 'CS' and c.cname = '数学' ) t where t.rn < 2;
需求4:查询数学成绩比数据库成绩高的学生信息和分数
select c.*,a.sscore,b.sscore from
(
--取出所有学生的数学成绩
select
sid,
cid,
sscore
from score where cid in (select cid from course where cname = '数学')
) a
join
(
--取出所有学生的数据库成绩
select
sid,
cid,
sscore
from score where cid in (select cid from course where cname = '数据库')
) b
on a.sid = b.sid
join student c on a.sid = c.sid where a.sscore > b.sscore;
需求5: 求每个课程分数最高的前三名学生(考虑分数相同的情况)
select * from (
select
a.sid,
a.sname,
a.department,
b.cid,
b.sscore,
c.cname,
dense_rank() over (partition by cname order by sscore desc) as rn
from student a join score b on a.sid = b.sid
join course c on b.cid = c.cid
) t where t.rn < 4;
-
规律
-
需求的结果中出现多张表字段:join
-
需求中的结果是一张表的字段,条件是另外一张表的字段:子查询、join
-
如果数据由多到少:过滤或者聚合
-
如果数据由少到多:join,union
-
以上是关于Hive 基础测试的主要内容,如果未能解决你的问题,请参考以下文章
[vscode]--HTML代码片段(基础版,reactvuejquery)
CTS测试CtsWindowManagerDeviceTestCases模块的testShowWhenLockedImeActivityAndShowSoftInput测试fail项解决方法(代码片段