HIVE查询语法

SELECT

需要准备的数据:

创建分区表语法
create table score(s_id string,c_id string, s_score int)
partitioned by (month string) row format delimited
fields terminated by ‘\t’;

加载数据到分区表中
load data local inpath '/export/servers/hivedatas/score.txt' 
into table score partition (month='201806');

score.txt

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
基本的Select操作

语法结构:

SELECT [ALL | DISTINCT] select_expr, select_expr, …

FROM table_reference

[WHERE where_condition]

[GROUP BY col_list [HAVING condition]]

[CLUSTER BY col_list
| [DISTRIBUTE BY col_list] [SORT BY| ORDER BY col_list]
]

[LIMIT number]

注:
1、order by 会对输入做全局排序,因此只有一个reducer时,会导致当输入规模较大时,需要较长的计算时间。
2、sort by不是全局排序是输入做全局排序,其在数据进入reducer前完成排序。因此,如果用sort by进行排序,并且设置mapred.reduce.tasks>1,则sort by只保证每个reducer的输出有序,不保证全局有序。

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

4、Cluster by(字段) 除了具有Distribute by的功能外,还会对该字段进行排序。
因此,如果分桶和sort字段是同一个时,此时,cluster by = distribute by + sort by
分桶表的作用:最大的作用是用来提高join操作的效率;

全表查询

select * from score;

选择特定列查询

select s_id ,c_id from score;

列别名

1)重命名一个列。
2)便于计算。
3)紧跟列名,也可以在列名和别名之间加入关键字‘AS’

select s_id as myid ,c_id from score;

常用函数

1)求总行数(count)

select count(1) from score;

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

select max(s_score) from score;

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

select min(s_score) from score;

4)求分数的总和(sum)

select sum(s_score) from score;

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

select avg(s_score) from score;

LIMIT语句

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

select * from score limit 3;

WHERE语句
1)使用WHERE 子句,将不满足条件的行过滤掉。
2)WHERE 子句紧随 FROM 子句。
3)案例实操
查询出分数大于60的数据

select * from score where s_score > 60;

比较运算符(BETWEEN/IN/ IS NULL)

下面表中描述了谓词操作符,这些操作符同样可以用于JOIN…ON和HAVING语句中。

操作符 支持的数据类型 描述
A=B 基本数据类型 如果A等于B则返回TRUE,反之返回FALSE
A<=>B A<=>B 如果A和B都为NULL,则返回TRUE,其他的和等号(=)操作符的结果一致,如果任一为NULL则结果为NULL
A<>B, 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>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相匹配,而不是只需与其字符串匹配。

案例实操

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

select * from score where s_score = 80;

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

select * from score where s_score between 80 and 98;

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

select * from score where s_score is null;

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

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

LIKE和RLIKE

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

2)选择条件可以包含字符或数字:
% 代表零个或多个字符(任意个字符)。
_ 代表一个字符。

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

4)案例实操
(1)查找以8开头的所有成绩

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

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

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

(3)查找成绩中含9的所有成绩数据

select * from score where s_score rlike '[9]';

逻辑运算符(AND/OR/NOT)

操作符 含义
AND 逻辑并
OR 逻辑或
NOT 逻辑否

案例实操
(1)查询成绩大于80,并且s_id是01的数据

select * from score where s_score >80 and s_id = '01';

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

select * from score where s_score > 80 or s_id = '01';

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

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

分组

GROUP BY语句
GROUP BY语句通常会和聚合函数一起使用,按照一个或者多个列队结果进行分组,然后对每个组执行聚合操作。

案例实操:
(1)计算每个学生的平均分数

select s_id ,avg(s_score) from score group by s_id;

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

select s_id ,max(s_score) from score group by s_id;

注: 注意group by的字段,必须是select后面的字段,select后面的字段不能比group by的字段多
group by语法中出现在select 后面的字段两个要求
1字段是分组字段
2必须使用聚合函数应用
select by s_id,s_score from score group by s_id;

HAVING语句

1)having与where不同点
(1)where针对表中的列发挥作用,查询数据;having针对查询结果中的列发挥作用,筛选数据。
(2)where后面不能写分组函数,而having后面可以使用分组函数。
(3)having只用于group by分组统计语句。
2)案例实操:
求每个学生的平均分数

select s_id ,avg(s_score) from score group by s_id;

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

select s_id ,avg(s_score) avgscore from score group by s_id having avgscore > 85;
发布了77 篇原创文章 · 获赞 153 · 访问量 6万+

猜你喜欢

转载自blog.csdn.net/weixin_45737446/article/details/103397691