HIVE 总结 五 Hive 查询
本篇总结hive操作的查询,毕竟在工作中查询才是用的最多的.
而hive的查询基本上跟MySQL的查询是一样的.
1.基本查询
-
语法
SELECT [ALL | DISTINCT] select_expr, select_expr, ... FROM table_reference [WHERE where_condition] [GROUP BY col_list] [HAVING col_list] [ORDER BY col_list] [CLUSTER BY col_list | [DISTRIBUTE BY col_list] [SORT BY col_list] ] [LIMIT number]
-
基本查询
select * from tablename select name from student select lastname as name from student
-
算术运算符
运算符 描述 A+B A和B 相加 A-B A减去B A*B A和B 相乘 A/B A除以B A%B A对B取余 A&B A和B按位取与 A|B A和B按位取或 A^B A和B按位取异或 ~A A按位取反 select sal +1 from emp;
-
常用函数(常用聚合函数)
1)求总行数(count)
select count(*) cnt from emp;
2)求工资的最大值(max)
select max(sal) max_sal from emp;
3)求工资的最小值(min)
select min(sal) min_sal from emp;
4)求工资的总和(sum)
select sum(sal) sum_sal from emp;
5)求工资的平均值(avg)
select avg(sal) avg_sal from emp; -
limit
典型的查询会返回多行数据。LIMIT子句用于限制返回的行数。
select * from emp limit 5;
select * from emp limit 2,3;
-
where
使用WHERE子句,将不满足条件的行过滤掉
WHERE子句紧随FROM子句
select * from emp where sal >1000;
-
比较运算符
操作符同样可以用于JOIN…ON和HAVING语句中
操作符 支持的数据类型 描述 A=B 基本数据类型 如果A等于B则返回TRUE,反之返回FALSE A<=>B 基本数据类型 如果A和B都为NULL,则返回TRUE,如果一边为NULL,返回False 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是基于java的正则表达式,如果A与其匹配,则返回TRUE;反之返回FALSE。匹配使用的是JDK中的正则表达式接口实现的,因为正则也依据其中的规则。例如,正则表达式必须和整个字符串A相匹配,而不是只需与其字符串匹配。 -
like和rlike
使用LIKE运算选择类似的值
选择条件可以包含字符或数字:
% 代表零个或多个字符(任意个字符)。
_ 代表一个字符
RLIKE子句
RLIKE子句是Hive中这个功能的一个扩展,其可以通过Java的正则表达式这个更强大的语言来指定匹配条件。
-- (1)查找名字以A开头的员工信息 select * from emp where ename LIKE 'A%'; select * from emp where ename RLIKE '^A'; -- (2)查找名字中第二个字母为A的员工信息 select * from emp where ename LIKE '_A%'; select * from emp where ename RLIKE '^.A'; -- (3)查找名字中带有A的员工信息 select * from emp where ename LIKE '%A%'; select * from emp where ename RLIKE '[A]';
-
逻辑运算符
操作符 含义 AND 逻辑并 OR 逻辑或 NOT 逻辑否 select * from emp where sal>1000 and deptno=30; select * from emp where sal>1000 or deptno=30; select * from emp where deptno not IN(30, 20);
2.分组查询
GROUP BY语句通常会和聚合函数一起使用,按照一个或者多个列队结果进行分组,然后对每个组执行聚合操作
select t.deptno, avg(t.sal) avg_sal from emp t group by t.deptno;
select t.deptno, t.job, max(t.sal) max_sal from emp t group by
t.deptno, t.job;
Having语句
where后面不能写分组聚合函数,而having后面可以使用分组聚合函数
having只用于group by分组统计语句
select deptno, avg(sal) avg_sal from emp group by deptno having avg_sal > 2000;
3.jion
旧版本中 Hive支持通常的SQL JOIN语句,但是只支持等值连接,不支持非等值连接
但是在新版本hive是支持非等值连接
hive的连接查询与MySQL的连接查询是一至的,但是请注意不要在hive中使用笛卡尔积连接,数据量大,懂吧?
内连接:只有进行连接的两个表中都存在与连接条件相匹配的数据才会被保留下来
左外连接:JOIN操作符左边表中符合WHERE子句的所有记录将会被返回
右外连接:JOIN操作符右边表中符合WHERE子句的所有记录将会被返回
满外连接:将会返回所有表中符合WHERE语句条件的所有记录。如果任一表的指定字段没有符合条件的值的话,那么就使用NULL值替代
多表连接:连接 n个表,至少需要n-1个连接条件。例如:连接三个表,至少需要两个连接条件
大多数情况下,Hive会对每对JOIN连接对象启动一个MapReduce任务。本例中会首先启动一个MapReduce job对表e和表d进行连接操作,然后会再启动一个MapReduce job将第一个MapReduce job的输出和表l;进行连接操作。
Hive总是按照从左到右的顺序执行的
笛卡尔积
(1)省略连接条件
(2)连接条件无效
(3)所有表中的所有行互相连接
4.排序
-
全局排序 order by
order by :全局排序,只有一个reduce
ASC:升序,正序
DESC:降序,倒序
栗子:略
-
按照别名进行排序 order by name
在查询时,将字段设置别名,再排序时,使用别名
栗子:略
-
多列排序 order by name1,name2
在查询时,需要同时按照两个或者多个字段进行排序,那么这多个字段以,隔开
栗子:
select * from student order 院系,班级,成绩
那么这SQL会按照院系,班级,成绩进行排序
-
每个reduce内部排序 sort by
Sort by为每个reducer产生一个排序文件。每个Reducer内部进行排序,对全局结果集来说不是排序。
设置reduce个数
set mapreduce.job.reduces=3; select * from emp sort by deptno desc;
在官方文档中描述,结果都是随机进入reduce,然后再进行随机排序.
将查询结果导入到文件中(按照部门编号降序排序)
insert overwrite local directory ‘/opt/module/hive/datas/sortby-result’
select * from emp sort by deptno desc;
-
分区 distribute by
Distribute By: 在有些情况下,我们需要控制某个特定行应该到哪个reducer,通常是为了进行后续的聚集操作。distribute by 子句可以做这件事。
distribute by类似MR中partition(自定义分区),进行分区,结合sort by使用。
对于distribute by进行测试,一定要分配多reduce进行处理,否则无法看到distribute by的效果。-- 先按照部门编号分区,再按照员工编号降序排序 set mapreduce.job.reduces=3; insert overwrite local directory '/opt/module/hive/datas/distribute-result' select * from emp distribute by deptno sort by sal desc;
注意:
distribute by的分区规则是根据分区字段的hash码与reduce的个数进行模除后,余数相同的分到一个区。
Hive要求DISTRIBUTE BY语句要写在SORT BY语句之前。
演示完以后mapreduce.job.reduces的值要设置回-1,否则下面分区or分桶表load跑mr的时候有可能会报错
-
分区排序 cluster by
当distribute by和sort by字段相同时,可以使用cluster by方式.
cluster by除了具有distribute by的功能外还兼具sort by的功能。但是排序只能是升序排序,不能指定排序规则为ASC或者DESC。
select * from emp cluster by deptno; select * from emp distribute by deptno sort by deptno;
以上两种写法的结果是相同的
同时,可以使用cluster by方式.
cluster by除了具有distribute by的功能外还兼具sort by的功能。但是排序只能是升序排序,不能指定排序规则为ASC或者DESC。
select * from emp cluster by deptno; select * from emp distribute by deptno sort by deptno;
以上两种写法的结果是相同的