我们用以下两个表格作为例子:
Name | Sex |
Birth |
Dept |
Uid |
---|---|---|---|---|
Liuyi |
F |
2002/11/26 |
CS |
180301 |
Chener |
F |
2001/6/11 |
CS |
180302 |
Zhangsan |
M |
2002/9/21 |
CS |
180303 |
Lisi |
F |
2001/1/26 |
SE |
180201 |
Uid |
Course |
Grade |
180301 |
Chinese |
90 |
180301 |
Math |
58 |
180301 |
English |
39 |
180302 |
Chinese |
91 |
180302 |
Math |
95 |
180302 |
English |
75 |
180303 |
Chinese |
60 |
180303 |
Math |
58 |
180303 |
English |
53 |
180201 |
Chinese |
62 |
180201 |
Math |
43 |
180201 |
English |
7 |
实验任务:
(1)启动hive。新建一个数据库db_zr,添加扩展参数:日期、姓名;后面我们会使用该数据库操作。
hive> create database db_zr with dbproperties('data'='2021-05-30','name'='zr');
hive>describe database extended db_zr;
#此语句可用来查看详细信息。
(2) 新建student_zr分区表(分区字段Dept)和grade_zr内部表,分别查看表结构和存储路径;(字段类型自定义)
hive> create table student_zr(Name string,Sex string,Birth string,Uid string)
>patitioned by(Dept string);
#创建student_zr分区表
hive> create table grade_zr(Uid string,Course string,Grade string);
#创建grade_zr内部表
hive> desc student_zr;
#对表结构进行查看
hive> dfs -ls /user/hive/warehouse;
#查询存储路径。
(3) 在表student_zr中添加两个分区Dept=’CS’和Dept=’SE’。
hive> alter table student_zr add partition(Dept='CS');
hive> alter table student_zr add partition(Dept='SE');
hive> show partitions student_zr;
#查看分区
(4)从本地导入数据到student_zr表的两个分区中,分别查看两个分区所有记录,查看表数据存储目录
zr@zr:~$ vim studentCS.txt
zr@zr:~$ vim studentSE.txt
#先在本地创建文本
zr@zr:~$ hdfs dfs -put studentCS.txt /user/zr/input
zr@zr:~$ hdfs dfs -put studentSE.txt /user/zr/input
#再将其上传到hdfs上
zr@zr:~$ hive #启动hive
hive> load data local inpath'studentCS.txt' into table student_zr partition(Dept='CS');
hive> load data local inpath'studentSE.txt' into table student_zr partition(Dept='SE');
#从本地导入数据到student_zr表对应的分区中
hive> select * from student_zr;
OK
Liuyi F 2002/11/26 180301 CS
Chener F 2001/6/11 180302 CS
Zhangsan M 2002/9/21 180303 CS
Lisi F 2001/1/26 180201 SE
#查看数据
hive> dfs -ls /user/hive/warehouse/student_zr;
Found 2 items
drwxr-xr-x - zr supergroup 0 2021-05-30 13:30 /user/hive/warehouse/student_zr/dept=CS
drwxr-xr-x - zr supergroup 0 2021-05-30 13:30 /user/hive/warehouse/student_zr/dept=SE
#查看存储路径
(5) 从HDFS导入数据到grade_zr表中,查看grade_zr表所有记录,查看表数据;
zr@zr:~$ vim grade.txt
zr@zr:~$ hdfs dfs -put grade.txt /user/zr/input
#同理,先创建文本上传
zr@zr:~$ hive
hive> load data inpath'/user/zr/input/grade.txt' into table grade_zr;
#启动hive并导入数据
hive> select * from grade_zr;
OK
180301 Chinese 90
180301 Math 58
180301 English 39
180302 Chinese 91
180302 Math 95
180302 English 75
180303 Chinese 60
180303 Math 58
180303 English 53
180201 Chinese 62
180201 Math 43
180201 English 74
Time taken: 3.071 seconds, Fetched: 12 row(s)
#查看数据
(6) 统计男生、女生人数;
hive> select Sex,count(1) from student_zr group by Sex;
#结果
F 3
M 1
(7)统计每个学生所有科目的总分以及平均分;
hive> select a.Uid,sum(a.Grade),avg(a.Grade) from grade_zr a group by Uid;
#结果
180201 179.0 59.666666666666664
180301 187.0 62.333333333333336
180302 261.0 87.0
180303 171.0 57.0
(8)统计每个科目有多少人以及每个科目平均成绩;
hive> select a.Course,count(1),avg(a.Grade) from grade_zr a group by Course;
#结果
Chinese 4 75.75
English 4 60.25
Math 4 63.5
(9)查询chinese科目得分排前两名学生学号和分数;
hive> select Uid,Course,Grade from grade_zr
> where Course='Chinese'
> order by Grade desc limit 2;
#结果
180302 Chinese 91
180301 Chinese 90
(10)创建一个新表rank_zr保存CS系每个学生信息和科目总分,按成绩降序排序,并查询结果;
hive> create table rank_zr
> as select student_zr.Name,student_zr.Sex,student_zr.Birth,student_zr.Uid,sum(grade_zr.Grade)
> from student_zr join grade_zr on student_zr.Uid=grade_zr.Uid
> where Dept='CS'
> group by student_zr.Name,student_zr.Sex,student_zr.Birth,student_zr.Uid
> order by sum(grade_zr.Grade) asc;
#创建新表
hive> select * from rank_zr;
OK
Zhangsan M 2002/9/21 180303 171.0
Liuyi F 2002/11/26 180301 187.0
Chener F 2001/6/11 180302 261.0
Time taken: 7.756 seconds, Fetched: 3 row(s)
(11) 统计每个系所有科目平均成绩在所有系中的占比。例如CS系Chinese科目平均成绩在所有系的比例是1.06;
hive> select b.Dept,a.Course,round(avg(a.Grade)/c.per,2) from grade_zr a
> join student_zr b on b.Uid=a.Uid
> join (select Course,avg(Grade) per from grade_zr group by Course) c on c.Course=a.Course
> group by a.Course,Dept,per;
#结果
CS Chinese 1.06
CS English 0.92
CS Math 1.11
SE Chinese 0.82
SE English 1.23
SE Math 0.68
(12)统计每个系每个科目考试不合格学生的占比;
hive> select b.Dept,a.Course,round(c.unpassnum/c.totalnum,2) from grade_zr a
> join student_zr b on b.Uid=a.Uid
> join (select Course,sum(case when grade<60 then 1 else 0 end) unpassnum,count(1) totalnum from grade_zr group by Course) c on c.Course=a.Course
> group by a.Course,Dept,unpassnum,totalnum;
#结果
CS Chinese 0.0
CS English 0.5
CS Math 0.75
SE Chinese 0.0
SE English 0.5
SE Math 0.75
(13) 删除分区,删除表,删除库,退出Hive;
hive> alter table student_zr drop partition(Dept='CS');
hive> alter table student_zr drop partition(Dept='SE');
hive> show partitions student_zr;#检查
hive> drop table student_zr;
hive> show tables;#检查
hive> drop database if exists db_zr;
hive> show databases;#检查
hive> exit;#退出