Hive常用查询语句

数据源如下:

学生表:
sid sname	birth		sex
01	赵雷	1990-01-0102	钱电	1990-12-2103	孙风	1990-05-2004	李云	1990-08-0605	周梅	1991-12-0106	吴兰	1992-03-0107	郑竹	1989-07-0108	王菊	1990-01-20	女
老师表:
tid tname
01	张三
02	李四
03	王五
课程表:
cid cname   tid
01	语文	02
02	数学	01
03	英语	03
成绩表:
sid cid score
01	01	80
01	02	90
01	03	99
02	01	70
02	02	60
02	03	80
03	01	80
03	02	80
03	03	80
04	01	50
04	02	30
04	03	20
05	01	76
05	02	87
06	01	31
06	03	34
07	02	89
07	03	98

下面将通过上述简单数据对hivesql的查询进行练习:

# 使用limit指定返回行数
select * from student limit 4;
OK
1	赵雷	1990-01-012	钱电	1990-12-213	孙风	1990-05-204	李云	1990-08-06Time taken: 0.203 seconds, Fetched: 4 row(s)

# 查询出分数大于60的数据
select * from score where score>60;
OK
1	1	80
1	2	90
1	3	99
2	1	70
2	3	80
3	1	80
3	2	80
3	3	80
5	1	76
5	2	87
7	2	89
7	3	98
Time taken: 1.555 seconds, Fetched: 12 row(s)

# 查询分数在80到100的所有数据
select * from score where score between 80 and 100;
OK
1	1	80
1	2	90
1	3	99
2	3	80
3	1	80
3	2	80
3	3	80
5	2	87
7	2	89
7	3	98
Time taken: 0.15 seconds, Fetched: 10 row(s)

# 查询成绩为空的所有数据
select * from score where score is NULL;
OK
Time taken: 0.157 seconds

# 查询成绩是80和90的数据
select * from score where score in (80, 90);
OK
1	1	80
1	2	90
2	3	80
3	1	80
3	2	80
3	3	80
Time taken: 0.139 seconds, Fetched: 6 row(s)

# 查找以8开头的所有成绩
select * from score where score like "8%";
OK
1	1	80
2	3	80
3	1	80
3	2	80
3	3	80
5	2	87
7	2	89
Time taken: 0.181 seconds, Fetched: 7 row(s)

# 查找第二个数值为9的所有成绩数据
select * from score where score like "_9%";
OK
1	3	99
7	2	89
Time taken: 0.153 seconds, Fetched: 2 row(s)

# 查找s_id中含1的数据
select * from score where score like "%1%";
OK
6	1	31
Time taken: 0.116 seconds, Fetched: 1 row(s)

# 计算每个学生的平均分数
select sid, avg(score) from score group by sid;
OK
1	89.66666666666667
2	70.0
3	80.0
4	33.333333333333336
5	81.5
6	32.5
7	93.5
Time taken: 3.568 seconds, Fetched: 7 row(s)

# 计算每个学生高成绩
select sid, cid, max(score) from score group by sid;
OK
1	99
2	80
3	80
4	50
5	87
6	34
7	98
Time taken: 1.698 seconds, Fetched: 7 row(s)

# 求每个学生平均分数大于85的人
select sid,avg(score) avg from score group by sid having avg > 85;
OK
1	89.66666666666667
7	93.5
Time taken: 6.188 seconds, Fetched: 2 row(s)

# 等值连接join
select stu.sid, stu.sname, stu.birth, stu.sex, sc.cid, sc.score from student stu join score sc on stu.sid = sc.sid;
OK
1	赵雷	1990-01-011	80
1	赵雷	1990-01-012	90
1	赵雷	1990-01-013	99
2	钱电	1990-12-211	70
2	钱电	1990-12-212	60
2	钱电	1990-12-213	80
3	孙风	1990-05-201	80
3	孙风	1990-05-202	80
3	孙风	1990-05-203	80
4	李云	1990-08-061	50
4	李云	1990-08-062	30
4	李云	1990-08-063	20
5	周梅	1991-12-011	76
5	周梅	1991-12-012	87
6	吴兰	1992-03-011	31
6	吴兰	1992-03-013	34
7	郑竹	1989-07-012	89
7	郑竹	1989-07-013	98
Time taken: 12.416 seconds, Fetched: 18 row(s)

# 内连接
select * from teacher t inner join course c on t.tid = c.tid;
OK
2	李四	1	语文	2
1	张三	2	数学	1
3	王五	3	英语	3
Time taken: 9.088 seconds, Fetched: 3 row(s)

# 左外连接
select * from teacher t left join course c on t.tid = c.tid;
OK
1	张三	2	数学	1
2	李四	1	语文	2
3	王五	3	英语	3
Time taken: 9.444 seconds, Fetched: 3 row(s)

# 右外链接
select * from teacher t right join course c on t.tid = c.tid;
OK
2	李四	1	语文	2
1	张三	2	数学	1
3	王五	3	英语	3
Time taken: 9.625 seconds, Fetched: 3 row(s)

# 多表连接
select * from teacher t left join course c
    > on t.tid=c.tid
    > left join score sc
    > on sc.cid=c.cid
    > left join student stu
    > on stu.sid=sc.sid;
OK
1	张三	2	数学	1	1	2	90	1	赵雷	1990-01-011	张三	2	数学	1	2	2	60	2	钱电	1990-12-211	张三	2	数学	1	3	2	80	3	孙风	1990-05-201	张三	2	数学	1	4	2	30	4	李云	1990-08-061	张三	2	数学	1	5	2	87	5	周梅	1991-12-011	张三	2	数学	1	7	2	89	7	郑竹	1989-07-012	李四	1	语文	2	1	1	80	1	赵雷	1990-01-012	李四	1	语文	2	2	1	70	2	钱电	1990-12-212	李四	1	语文	2	3	1	80	3	孙风	1990-05-202	李四	1	语文	2	4	1	50	4	李云	1990-08-062	李四	1	语文	2	5	1	76	5	周梅	1991-12-012	李四	1	语文	2	6	1	31	6	吴兰	1992-03-013	王五	3	英语	3	1	3	99	1	赵雷	1990-01-013	王五	3	英语	3	2	3	80	2	钱电	1990-12-213	王五	3	英语	3	3	3	80	3	孙风	1990-05-203	王五	3	英语	3	4	3	20	4	李云	1990-08-063	王五	3	英语	3	6	3	34	6	吴兰	1992-03-013	王五	3	英语	3	7	3	98	7	郑竹	1989-07-01Time taken: 10.311 seconds, Fetched: 18 row(s)

# 全局排序order by只有一个reduce 
# ASC(升序排序,默认)
select * from score order by score;
OK
4	3	20
4	2	30
6	1	31
6	3	34
4	1	50
2	2	60
2	1	70
5	1	76
1	1	80
3	3	80
3	2	80
3	1	80
2	3	80
5	2	87
7	2	89
1	2	90
7	3	98
1	3	99
Time taken: 1.34 seconds, Fetched: 18 row(s)
# DESC(降序排序)
select * from score order by score;
OK
1	3	99
7	3	98
1	2	90
7	2	89
5	2	87
3	3	80
3	2	80
3	1	80
2	3	80
1	1	80
5	1	76
2	1	70
2	2	60
4	1	50
6	3	34
6	1	31
4	2	30
4	3	20
Time taken: 1.46 seconds, Fetched: 18 row(s)

# 多列排序
select sid,avg(score) avg_score from score group by sid order by sid,avg_score;
OK
1	89.66666666666667
2	70.0
3	80.0
4	33.333333333333336
5	81.5
6	32.5
7	93.5
Time taken: 2.658 seconds, Fetched: 7 row(s)

# 每个MapReduce内部有序(sort by)
# 先设置reduce个数
set mapreduce.job.reduces=3;
# reduce内部按成绩排序
select * from score sort by score;
OK
6	1	31
4	1	50
2	2	60
2	3	80
3	1	80
3	2	80
3	3	80
7	3	98
------------
6	3	34
5	1	76
1	1	80
------------
4	3	20
4	2	30
2	1	70
5	2	87
7	2	89
1	2	90
1	3	99
Time taken: 1.285 seconds, Fetched: 18 row(s)

# 分区DISTRIBUTE BY,一般配合sort by使用,组合使用就有分区排序效果
# 首先设置分区数
set mapreduce.job.reduces=7;
# 按学号分区,分区内部按成绩排序
select * from score distribute by sid order by score;
OK
7	2	89
7	3	98
3	3	80
3	2	80
3	1	80
2	2	60
2	1	70
2	3	80
6	1	31
6	3	34
4	3	20
4	2	30
4	1	50
5	1	76
5	2	87
1	1	80
1	2	90
1	3	99
Time taken: 1.306 seconds, Fetched: 18 row(s)

# 分区排序之cluster by
# 使用cluster by等同于使用distribute by sid sort by sid 以sid分区并按sid排序
select *from score cluster by sid;
OK
7	3	98
7	2	89
3	3	80
3	2	80
3	1	80
2	1	70
2	3	80
2	2	60
6	1	31
6	3	34
4	3	20
4	2	30
4	1	50
5	1	76
5	2	87
1	1	80
1	3	99
1	2	90
Time taken: 1.325 seconds, Fetched: 18 row(s)


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值