Hive查询之分组与Join
Hive查询之分组与Join
文章目录
- Hive查询之分组与Join
- 写在前面
- 分组
- Group By语句
- Having语句
- Join语句
- 等值Join
- 表的别名
- 好处
- 案例实操
- 内连接
- 左外连接
- 右外连接
- 满外连接
- 多表连接
- 笛卡尔积
写在前面
- Linux版本:
CentOS7.5
- Hive版本:
Hive-3.1.2
分组
Group By语句
GROUP BY语句通常会和聚合函数一起使用,按照一个或者多个列队结果进行分组,然后对每个组执行聚合操作。
案例实操:
(1)计算emp表每个部门的平均工资
hive (default)> select t.deptno, avg(t.sal) avg_sal from emp t group by t.deptno;
(2)计算emp每个部门中每个岗位的最高薪水
hive (default)> select t.deptno, t.job, max(t.sal) max_sal from emp t group by t.deptno, t.job;
Having语句
having与where不同点
- where后面不能写分组函数,而having后面可以使用分组函数。
- having只用于group by分组统计语句。
案例实操
(1)求每个部门的平均薪水大于2000的部门
- 求每个部门的平均工资
hive (default)> select deptno, avg(sal) from emp group by deptno;
- 求每个部门的平均薪水大于2000的部门
hive (default)> select deptno, avg(sal) avg_sal from emp group by deptno having avg_sal > 2000;
Join语句
等值Join
Hive支持通常的SQL JOIN语句。
- 案例实操
根据员工表和部门表中的部门编号相等,查询员工编号、员工名称和部门名称;
hive (default)> select e.empno, e.ename, d.deptno, d.dname from emp e join dept d on e.deptno = d.deptno;
表的别名
好处
- 使用别名可以简化查询。
- 使用表名前缀可以提高执行效率。
案例实操
合并员工表和部门表
hive (default)> select e.empno, e.ename, d.deptno from emp e join dept d on e.deptno = d.deptno;
内连接
内连接:只有进行连接的两个表中都存在与连接条件相匹配的数据才会被保留下来。
hive (default)> select e.empno, e.ename, d.deptno from emp e join dept d on e.deptno = d.deptno;
左外连接
左外连接:JOIN操作符左边表中符合WHERE子句的所有记录将会被返回。
hive (default)> select e.empno, e.ename, d.deptno from emp e left join dept d on e.deptno = d.deptno;
右外连接
右外连接:JOIN操作符右边表中符合WHERE子句的所有记录将会被返回。
hive (default)> select e.empno, e.ename, d.deptno from emp e right join dept d on e.deptno = d.deptno;
满外连接
满外连接:将会返回所有表中符合WHERE语句条件的所有记录。如果任一表的指定字段没有符合条件的值的话,那么就使用NULL值替代。
hive (default)> select e.empno, e.ename, d.deptno from emp e full join dept d on e.deptno = d.deptno;
多表连接
注意:连接 n个表,至少需要n-1个连接条件。例如:连接三个表,至少需要两个连接条件。
- 数据准备
1700 Beijing
1800 London
1900 Tokyo
- 创建位置表
create table if not exists location(
loc int,
loc_name string
)
row format delimited fields terminated by '\t';
- 导入数据
hive (default)> load data local inpath '/opt/module/datas/location.txt' into table location;
- 多表连接查询
hive (default)>SELECT e.ename, d.dname, l.loc_name
FROM emp e
JOIN dept d
ON d.deptno = e.deptno
JOIN location l
ON d.loc = l.loc;
大多数情况下,Hive会对每对JOIN连接对象启动一个MapReduce任务。本例中会首先启动一个MapReduce job对表e和表d进行连接操作,然后会再启动一个MapReduce job将第一个MapReduce job的输出和表l;进行连接操作。
注意:为什么不是表d和表l先进行连接操作呢?这是因为Hive总是按照从左到右的顺序执行的。
优化:当对3个或者更多表进行join连接时,如果每个on子句都使用相同的连接键的话,那么只会产生一个MapReduce job。
笛卡尔积
笛卡尔积会在下面条件下产生
- 省略连接条件
- 连接条件无效
- 所有表中的所有行互相连接
案例实操
hive (default)> select empno, dname from emp, dept;
全文结束!!!