全局排序(Order by)
1.按照别名排序
hive
(default)> select ename
, sal
*2 twosal from emp order by twosal
;
2.多个列排序
hive
(default)> select ename
, deptno
, sal from emp order by deptno
, sal
;
每个MapReduce内部排序(Sort By)
1.设置reduce个数
hive
(default)> set mapreduce
.job
.reduces
=3;
2.查看设置reduce个数
hive
(default)> set mapreduce
.job
.reduces
;
3.根据部门编号降序查看员工信息
hive
(default)> select
* from emp sort by empno desc
;
4.将查询结果导入到文件中(按照部门编号降序排序)
hive
(default)> insert overwrite local directory
'/opt/sortbyresult'
select
* from emp sort by deptno desc
;
分区排序(Distribute By)
1.Distribute By:类似MR中partition,进行分区,结合sort by使用。
注意,Hive要求Distribute By语句要写在sort by语句之前。对于distribute by进行测试,一
定要分配多reduce进行处理,否则无法看到distribute by的效果。
2.案例实操:
先按照部门编号分区,再按照员工编号降序排序。
hive
(default)> set mapreduce
.job
.reduces
=3;
hive
(default)> select
* from emp distribute by deptno sort by empno desc
;
Cluster By
当distribute by和sorts 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
;
注意:按照部门编号分区,不一定就是固定死的数值,可以是
20号和
30号部门分到一个分区里面去。
常用查询函数
空字段赋值
eg
:如果员工的comm为NULL,则用
-1代替
select
nvl(comm
,-1) from emp
;
case when
1.求出不同部门男女各多少人
select dept_id
,
sum(case sex when
'男' then
1 else 0 end
) male_count
,
sum(case sex when
'女' then
1 else 0 end
) female_count
from emp_sex group by dept_id
;
行转列
1.相关函数说明
CONCAT(string A
/col
, string B
/col…
):返回输入字符串连接后的结果,支持任意个输入字串
;
CONCAT_WS(separator
, str1
, str2
,...):它是一个特殊形式的
CONCAT()。第一个参数剩余参
数间的分隔符。分隔符可以是与剩余参数一样的字符串。如果分隔符是 NULL,返回值也将为
NULL。这个函数会跳过分隔符参数后的任何 NULL 和空字符串。分隔符将被加到被连接的字符串
之间
;
COLLECT_SET(col
):函数只接受基本数据类型,它的主要作用是将某字段的值进行去重汇总,产
生array类型字段。
列转行