Hive的常用操作

我们用以下两个表格作为例子:

student_zr
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

grade_zr

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;#退出

你可能感兴趣的:(大数据,hive)