1:内连接(7)
只有进行连接的两个表中都存在与连接条件相匹配的数据才会被保留下来
hive (default)> select e.empno, e.ename, d.deptno, d.dname from emp e join dept d on e.deptno = d.deptno;
2:左外连接(1)
join操作符左边表中符合where子句的所有记录将会被返回
hive (default)> select e.empno, e.ename, d.deptno from emp e left join dept d on e.deptno = d.deptno;
3:右外连接(6)
join操作符右边表中符合where子句的所有记录将会被返回
hive (default)> select e.empno, e.ename, d.deptno from emp e right join dept d on e.deptno = d.deptno;
4:满外连接(3)
将会返回所有表中符合where语句条件的所有记录,如果任一的指定字符没有符合条件的值的话,那么就用null值替代
hive (default)> select e.empno, e.ename, d.deptno from emp e full join dept d on e.deptno = d.deptno;
5:取左表独有数据(2)
两个表之间的差值,A-B
hive (default)> select e.empno, e.ename, d.deptno from emp e left join dept d on e.deptno = d.deptno where d.deptno is null; hive (default)> select e.empno, e.ename, e.deptno from emp e where e.deptno not in(select deptno from dept)
6:取右表独有数据(5)
hive (default)> select d.empno, d.ename from emp e right join dept d on e.deptno = d.deptno where e.deptno is null;
7:取左右两表独有数据(4)
hive (default)> select e.empno, e.ename, d.deptno from emp e full join dept d on e.deptno = d.deptno where e.deptno is null or d.deptno is null;
8:多表连接
hive (default)>SELECt e.ename, d.d name , 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。
9:笛卡尔积
假设A表有4条数据,分别是1,2,3,4.B表有三条数据,分别是a,b,c。
笛卡尔积之后的记过就是12条,(1,a),(1,b),(1,c),(1,d)....
产生条件 1:省略连接条件 2:连接条件无效 3:所有表中的所有行可以互相连接 hive (default)> select empno, d name from emp, dept;
10:全局排序(Order By):只有一个Reducer
asc:升序,默认。desc:降序。
查询员工信息按工资升序排列 hive (default)> select * from emp order by sal; 查询员工信息按工资降序排列 hive (default)> select * from emp order by sal desc;
11:按照别名排序
按照员工薪水的两倍排序 hive (default)> select ename, sal*2 twosal from emp order by twosal;
12:多个列排序
按照部门和工资升序排序 hive (default)> select ename, deptno, sal from emp order by deptno, sal;
13:Sort By排序(每个Reduce内部排序),不是全局排序,随机排序,无分区规则
Sort By 对于大规模的数据集order by的效率非常低。在很多情况下并不需要全局排序此时可以使用sort by。Sort by为每个reducer产生一个排序文件。每个Reducer内部进行排序对全局结果集来说不是排序。
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 deptno desc; 4:将查询结果导入到文件中 hive (default)> insert overwrite local directory '/opt/module/data/sortby result' select * from emp sort by deptno desc;
14:Distribute By分区(为了设置分区规则)
Distribute By在有些情况下我们需要控制某个特定行应该到哪个reducer 通常是为了进行后续的聚集操作。distribute by 子句可以做这件事 。distribute by 类似 MR 中 partition(自定义分区 ),进行分区,结合 sort by使用。
1:先按照部门编号分区,再按照员工编号降序排序 hive (default)> set mapreduce.job.reduces=3; hive (default)> insert overwrite local directory '/opt/module/data/distribute result' select * from emp distribute by deptno sort by empno desc;
15:Cluster By排序
当distribute by 和 sorts by字段相同时,可以使用cluster by方式。
cluster by除了具有 distribute by 的功能外还兼具 sort by 的功能。但是排序 只能是升序排序,不能指定排序规则为 ASC 或者 DESC 。
等价的两种写法 hive (default)> select * from emp cluster by deptno; hive (default)> select * from emp distribute by deptno sort by deptno; 按照部门编号分区,不一定就是固定死的数值,可以是 20 号和 30 号部门分到一个分区里面去。



