07 Hive QL高级功能

与SQL类似,Hive QL具有一般查询、聚合函数、distinct去除重复、order排序、连接查询等功能。

一、查询

  1. select * from emp;
  2. select ename,deptid,degree from emp;
  3. select * from dept;
  4. select deptid,dname from dept;

注意:在Hive早期版本中,只有使用查询全部字段才不会触发MapReduce操作,如果以select后指定查询某些字段,则会触发MapReduce操作。但在Hive新版本中,不管使用查询全部字段,还是使用select后指定查询某些字段,都不会触发MapReduce操作。

二、函数

在查询中使用upper等函数,同样不会触发MapReduce操作。

  1. select upper(ename), deptid, degree from emp;

07 Hive QL高级功能 - 图1

三、统计函数

与SQL语句相同

  • count():统计记录条数
  • max():求最大值
  • min():求最小值
  • sum():求和
  • avg():求平均值

使用这些函数都会触发 MapReduce 操作

  1. select count(*),max(degree),min(degree),avg(degree),sum(degree) from emp;

07 Hive QL高级功能 - 图2

四、distinct去除重复值

  1. select distinct(deptid) from emp;

07 Hive QL高级功能 - 图3

五、 limit限制返回记录的条数

与SQL语句相同,使用limit限制返回记录的最大条数

  1. SELECT upper(ename), deptid,degree FROM emp LIMIT 3;

07 Hive QL高级功能 - 图4

六、为列名取别名

与SQL语句相同,使用as为列指定别名,但Hive QL并不显示列名称,所以别名意义不大

  1. SELECT upper(ename) as empnamedeptid as empdeptid from emp LIMIT 3;

七、case when then多路分支

类似于Java中的switch…case语法,可以用case when then实现多路分支的效果

  1. -- 级别低于3follower(跟随者),级别高于5leader(领导者),否则为中间层。
  2. select ename ,case when degree<3 then 'follower' when degree>5 then 'leader' else 'middle' end as newdegree from emp;

07 Hive QL高级功能 - 图5

八、like模糊查询

like如同SQL语句,可以对字符型字段进行模糊查询

  1. -- '%o%'中的%表示字母o前后可以是任意字符,结果查出了姓名中含有o的有3个人
  2. select * from emp where ename like '%o%';

九、group by分组统计

与SQL语句相同,group by语句表示分组统计

  1. select deptid, avg (degree) from emp group by deptid;

分部门统计每个部门员工的平均级别。注意:使用group by分组统计的场合,select后只能出现分组字段和聚合函数,而不能有其他字段。

十、having过滤分组统计结果

与SQL语句相同,having后面跟聚合函数,对分组统计的结果进行过滤

  • 条件having avg(degree)>3过滤掉了平均级别低于3的部门员工
  1. select deptid, avg (degree) from emp group by deptid having avg(degree)>3;

十一、inner join内联接

与 SQL 一样,inner join表示内联接

  1. select e.*, d.* from emp e inner join dept d on e.deptid=d.deptid;
  2. -- inner关键字可省略
  3. select e.*, d.* from emp ejoin dept d on e.deptid=d.deptid;

07 Hive QL高级功能 - 图6

十二、left outer join和right outer join外联接

  1. -- left outer join表示左外联接
  2. select e.*, d.* from emp e left outer join dept d on e.deptid=d.deptid;
  3. -- right outer join表示右外联接
  4. select e.*, d.* from emp e right outer join dept d on e.deptid=d.deptid;
  • left outer join显示左表全部数据。如果右表没有数据与之对应,则显示NULL

07 Hive QL高级功能 - 图7

  • right outer join显示右表全部数据,如果左表没有数据与之对应,则显示NULL(因为emp表中并没有35、36、37这3个部门的员工,所以左边全部显示为NULL)

07 Hive QL高级功能 - 图8

十三、full outer join 外部链接

full outer join表示完全外部链接,执行后会显示full outer join左右两表的全部数据;如果左表或右表中没有对应数据,则显示为NULL。

  1. select e. *, d . * from emp e full outer join dept d on e . deptid =d.deptid;

07 Hive QL高级功能 - 图9

十四、order by 排序

order by 后面指明排序字段,默认是按 asc 升序排序,也可用 desc 指示降序排序。

  1. select * from emp order by deptid;

或使用如下命令

  1. -- deptid字段由大至小进行了降序排序
  2. select * from emp order by deptid desc;

十五、where 查找

按指定条件进行查找使用 where

  1. -- 查询结果为31这个部门的所有员工
  2. select * from emp where deptid=31;

如果要查询sales部门的所有员工信息,hive并不支持SQL中的子查询,正确的做法是利用联接查询来实现

  1. select e. *, d.dname from emp e join dept d on e.deptid=d.deptid where d.dname='sales';

总结

Hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表,并提供简单的SQL查询功能,可以将SQL语句转换为MapReduce任务进行运行。其优点是学习成本低,可以通过类SQL语句快速实现简单的MapReduce统计,而不必开发专门的MapReduce应用,十分适合数据仓库的统计分析。