×

Hive

大数据Hive(四):Hive查询语法

Lanson Lanson 发表于2021-11-13 17:39:26 浏览449 评论0

抢沙发发表评论

全网最详细的Hive文章系列,强烈建议收藏加关注!

后面更新文章都会列出历史文章目录,帮助大家回顾知识重点。

目录

系列历史文章

前言

hive查询语法

一、SELECT语句

1、语句结构

2、全表查询

3、选择特定列查询

4、列别名

5、常用函数

6、LIMIT语句

7、WHERE语句

二、运算符

1、比较运算符

2、逻辑运算符

三、分组

1、GROUP BY语句

2、HAVING语句

四、JOIN语句

1、内连接(INNER JOIN)

2、左外连接(LEFT OUTER JOIN)

3、右外连接(RIGHT OUTER JOIN)

4、满外连接(FULL OUTER JOIN)

5、多表连接

五、排序

1、Order By-全局排序

2、Sort By-每个MapReduce内部局部排序

3、Distribute By-分区排序

4、Cluster By


系列历史文章

2021年大数据Hive(十二):Hive综合案例!!!

2021年大数据Hive(十一):Hive调优

2021年大数据Hive(十):Hive的数据存储格式

2021年大数据Hive(九):Hive的数据压缩

2021年大数据Hive(八):Hive自定义函数

2021年大数据Hive(七):Hive的开窗函数

2021年大数据Hive(六):Hive的表生成函数

2021年大数据Hive(五):Hive的内置函数(数学、字符串、日期、条件、转换、行转列)

2021年大数据Hive(四):Hive查询语法

2021年大数据Hive(三):手把手教你如何吃透Hive数据库和表操作(学会秒变数仓大佬)

2021年大数据Hive(二):Hive的三种安装模式和MySQL搭配使用

2021年大数据Hive(一):Hive基本概念


前言

 2021大数据领域优质创作博客,带你从入门到精通,该博客每天更新,逐渐完善大数据各个知识体系的文章,帮助大家更高效学习。

有对大数据感兴趣的可以关注微信公众号:三帮大数据


hive查询语法


一、SELECT语句


1、语句结构

基本语法:

SELECT [ALL | DISTINCT]select_expr, select_expr, ...

FROM table_reference

[WHERE where_condition]

[GROUP BY col_list]

[HAVING where_condition]

[ORDER BY col_list]

[CLUSTER BY col_list

  | [DISTRIBUTE BY col_list] [SORT BY col_list]

]

[LIMIT number]

1、ORDER BY用于全局排序,就是对指定的所有排序键进行全局排序,使用ORDER BY的查询语句,最后会用一个Reduce Task来完成全局排序。解释:

2、sort by用于分区内排序,即每个Reduce任务内排序,则sort by只保证每个reducer的输出有序,不保证全局有序。

3、distribute by(字段)根据指定的字段将数据分到不同的reducer,且分发算法是hash散列。

4、cluster by(字段) 除了具有Distribute by的功能外,还兼具sort by的排序功能。。

因此,如果distribute bysort by字段是同一个时,此时,cluster by = distribute by + sort by


2、全表查询

select * from score;


3、选择特定列查询

select sid ,cid from score;


4、列别名

select sid as myid ,cid from score;


5、常用函数

1)求总行数(count)

 select count(1) from score;

2)求分数的最大值(max)

 select max(sscore) from score;

3)求分数的最小值(min)

 select min(sscore) from score;

4)求分数的总和(sum)

 select sum(sscore) from score;

5)求分数的平均值(avg)

 select avg(sscore) from score;


6、LIMIT语句

典型的查询会返回多行数据。LIMIT子句用于限制返回的行数。

select * from score limit 3;


7、WHERE语句

1)使用WHERE 子句,将不满足条件的行过滤掉。

2)WHERE 子句紧随 FROM 子句。

3)案例实操

查询出分数大于60的数据

select * from score where sscore > 60;


二、运算符


1、比较运算

1、操作符

操作符

支持的数据类型

描述

A=B

基本数据类型

如果A等于B则返回TRUE,反之返回FALSE

A<=>B

基本数据类型

如果A和B都为NULL,则返回TRUE,其他的和等号(=)操作符的结果一致,如果任一为NULL则结果为NULL

A<>B, A!=B

基本数据类型

A或者B为NULL则返回NULL;如果A不等于B,则返回TRUE,反之返回FALSE

A

基本数据类型

A或者B为NULL,则返回NULL;如果A小于B,则返回TRUE,反之返回FALSE

A<=B

基本数据类型

A或者B为NULL,则返回NULL;如果A小于等于B,则返回TRUE,反之返回FALSE

A>B

基本数据类型

A或者B为NULL,则返回NULL;如果A大于B,则返回TRUE,反之返回FALSE

A>=B

基本数据类型

A或者B为NULL,则返回NULL;如果A大于等于B,则返回TRUE,反之返回FALSE

A [NOT] BETWEEN B AND C

基本数据类型

如果A,B或者C任一为NULL,则结果为NULL。如果A的值大于等于B而且小于或等于C,则结果为TRUE,反之为FALSE。如果使用NOT关键字则可达到相反的效果。

A IS NULL

所有数据类型

如果A等于NULL,则返回TRUE,反之返回FALSE

A IS NOT NULL

所有数据类型

如果A不等于NULL,则返回TRUE,反之返回FALSE

IN(数值1, 数值2)

所有数据类型

使用 IN运算显示列表中的值

A [NOT] LIKE B

STRING 类型

B是一个SQL下的简单正则表达式,如果A与其匹配的话,则返回TRUE;反之返回FALSE。B的表达式说明如下:‘x%’表示A必须以字母‘x’开头,‘%x’表示A必须以字母’x’结尾,而‘%x%’表示A包含有字母’x’,可以位于开头,结尾或者字符串中间。如果使用NOT关键字则可达到相反的效果。

A RLIKE B, A REGEXP B

STRING 类型

B是一个正则表达式,如果A与其匹配,则返回TRUE;反之返回FALSE。匹配使用的是JDK中的正则表达式接口实现的,因为正则也依据其中的规则。例如,正则表达式必须和整个字符串A相匹配,而不是只需与其字符串匹配。

2、案例实操

(1)查询分数等于80的所有的数据

select * from score where sscore = 80;

(2)查询分数在80到100的所有数据

select * from score where sscore between 80 and 100;

(3)查询成绩为空的所有数据

select * from score where sscore is null;

(4)查询成绩是80或 90的数据

select * from score where sscore in(80,90);


3、LIKE和RLIKE

1)使用LIKE运算选择类似的值

2)选择条件可以包含字符或数字:

% 代表零个或多个字符(任意个字符)。

_ 代表一个字符。

3)RLIKE子句是Hive中这个功能的一个扩展,其可以通过Java的正则表达式这个更强大的语言来指定匹配条件。

4)案例实操

(1)查找以8开头的所有成绩

select * from score where sscore like '8%';

(2)查找第二个数值为9的所有成绩数据

select * from score where sscore like '_9%';

(3)查找id中含1的所有成绩信息

select * from score where sid rlike '[1]';


2、逻辑运算

操作符

含义

AND

逻辑并

OR

逻辑或

NOT

逻辑否

案例实操

(1)查询成绩大于80,并且sid是01的数据

select * from score where sscore >80 and sid = '01';

(2)查询成绩大于80,或者sid  是01的数

select * from score where sscore > 80 or sid = '01';

(3)查询sid  不是 01和02的学生

select * from score where sid not in ('01','02');


三、分组


1、GROUP BY语句

GROUP BY语句通常会和聚合函数一起使用,按照一个或者多个列队结果进行分组,然后对每个组执行聚合操作。注意使用group  by分组之后,select后面的字段只能是分组字段和聚合函数。

案例实操:

1)计算每个学生的平均分数

select sid ,avg(sscore) from score group by sid;

2)计算每个学生最高成绩

select sid ,max(sscore) from score group by sid;


2、HAVING语句

1、having与where不同点

(1)where针对表中的列发挥作用,查询数据;having针对查询结果中的列发挥作用,筛选数据。

(2)where后面不能写分组函数,而having后面可以使用分组函数。

(3)having只用于group by分组统计语句。

2、案例实操:

-- 求每个学生的平均分数

select sid ,avg(sscore) from score group by sid;

-- 求每个学生平均分数大于85的人

select sid ,avg(sscore) avgscore from score group by sid having avgscore > 85;


四、JOIN语句

Hive的join操作只支持等值连接

1、内连接(INNER JOIN)

内连接:只有进行连接的两个表中都存在与连接条件相匹配的数据才会被保留下来。

select * from teacher t, course c where t.tid = c.tid; #隐式内连接

select * from teacher t inner join course c on t.tid = c.tid; #显式内连接

select * from teacher t join course c on t.tid = c.tid;

2、左外连接(LEFT OUTER JOIN)

左外连接:JOIN操作符左边表中符合WHERE子句的所有记录将会被返回。

查询老师对应的课程

select * from teacher t left join course c on t.tid = c.tid;

3、右外连接(RIGHT OUTER JOIN)

右外连接:JOIN操作符右边表中符合WHERE子句的所有记录将会被返回。

select * from teacher t right join course c on t.tid = c.tid;

4、满外连接(FULL OUTER JOIN)

满外连接:将会返回所有表中符合WHERE语句条件的所有记录。如果任一表的指定字段没有符合条件的值的话,那么就使用NULL值替代。

SELECT * FROM teacher t FULL JOIN course c ON t.tid = c.tid ;

5、多表连接

注意:连接 n个表,至少需要n-1个连接条件。例如:连接三个表,至少需要两个连接条件。

多表连接查询,查询老师对应的课程,以及对应的分数,对应的学生

select * from teacher t

left join course c

on t.tid = c.tid

left join score s

on s.cid = c.cid

left join student stu

on s.sid = stu.sid;

大多数情况下,Hive会对每对JOIN连接对象启动一个MapReduce任务。本例中会首先启动一个MapReduce job对表teacher和表course进行连接操作,然后会再启动一个MapReduce job将第一个MapReduce job的输出和表score;进行连接操作。


五、排序


1、Order By-全局排序

Order By:全局排序,一个reduce

1、使用 ORDER BY 子句排序

ASC(ascend): 升序(默认)

DESC(descend): 降序

2、ORDER BY 子句在SELECT语句的结尾。

3、案例实操

(1)查询学生的成绩,并按照分数降序排列

SELECT * FROM student s LEFT JOIN score sco ON s.sid = sco.sid ORDER BY sco.sscore DESC;

(2)按照分数的平均值排序

select sid ,avg(sscore) avg from score group by sid order by avg;

(3)按照学生id和平均成绩进行排序

select sid ,avg(sscore) avg from score group by sid order by sid,avg;


2、Sort By-每个MapReduce内部局部排序

Sort By:每个MapReduce内部进行排序,对全局结果集来说不是排序。

1)设置reduce个数

 set mapreduce.job.reduces=3;

2)查看设置reduce个数

 set mapreduce.job.reduces;

3)查询成绩按照成绩降序排列

 select * from score sort by sscore;

4)将查询结果导入到文件中(按照成绩降序排列)

 insert overwrite local directory '/export/data/exporthive/sort' select * from score sort by sscore;


3、Distribute By-分区排序

Distribute By:类似MR中partition,进行分区,结合sort by使用。

注意,Hive要求DISTRIBUTE BY语句要写在SORT BY语句之前。

对于distribute by进行测试,一定要分配多reduce进行处理,否则无法看到distribute by的效果。


案例实操:

先按照学生id进行分,再按照学生成绩进行排序。

1)设置reduce的个数,将我们对应的sid划分到对应的reduce当中去

set mapreduce.job.reduces=7;

2)通过distribute by进行数据的分区

insert overwrite local directory '/export/data/exporthive/distribute' select * from score distribute by sid sort by sscore;


4、Cluster By

当distribute by和sort by字段相同时,可以使用cluster by方式。

cluster by除了具有distribute by的功能外还兼具sort by的功能。但是排序只能是升序排序,不能指定排序规则为ASC或者DESC。

以下两种写法等价:

select * from score cluster by sid; 

select * from score distribute by sid sort by sid;

  • 📢博客主页:https://lansonli.blog.csdn.net

  • 📢欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正!

  • 📢本文由 Lansonli 原创,首发于 CSDN博客🙉

  • 📢大数据系列文章会每天更新,停下休息的时候不要忘了别人还在奔跑,希望大家抓紧时间学习,全力奔赴更美好的生活✨


欢迎留言

访客