1.等值join:Hive支持通常的SQL JOIN语句,但是只支持等值连接,==不支持非等值连接==
eg. 根据学生和成绩表,查询学生姓名对应的成绩
select * from stu left join score on stu.id = score.s_id;
2.内连接(inner join):只有进行连接的两个表都存在与连接条件相匹配的数据才会被保留下来
eg. select * from teacher t inner join course c on t.t_id = c.t_id;
(SELECT
(data)
FROM
TABLE A
INNER JOIN TABLE B ON A.key = B.key)
- 左外连接(left outer join):join操作符左边表中符合where子句的所有记录将会被返回。右边表的指定字段没有符合条件的值的话,那么就使用null值替代
eg.hive(default) > select e.empno,e.name,d.deptno from emp e left join dept d on e.deptno=d.deptno;
(SELECT
(data)
FROM
TABLE A
LEFT JOIN TABLE B ON A.key = B.key
WHERE B.key IS NULL)
3.右外连接(right outer join):join操作符右边表中符合where子句的所有记录将会被返回。左边表的指定字段没有符合条件的值的话,那么就使用null值替代
eg. hive(default) > select e.empno,e.name,d.deptno fro emp e right join dept d on e.deptno=d.deptno;
(SELECT
(data)
FROM
TABLE A
RIGHT JOIN TABLE B ON A.key = B.key
WHERE A.key IS NULL)
4.满外连接(full outer join):将会返回所有表中符合where语句条件的所有记录,如果任一表的指定字段没有符合条件的值的话,就用NULL值替代
eg.hive(default) > select e.empno,e.ename,d.deptno from
emp e full join dept d on e.deptno =d.deptno;
5.左连接:
(SELECT
(data)
FROM
TABLE A
LEFT JOIN TABLE B ON A.key = B.key)
6.右连接:
(SELECT
(data)
FROM
TABLE A
RIGHT JOIN TABLE B ON A.key = B.key)
7.多表连接:连接 n个表,至少需要n-1个连接条件。例如:连接三个表,至少需要两个连接条件。
eg. 多表连接查询,查询老师对应的课程,以及对应的分数,对应的学生
select * from teacher t
left join course c on t.t_id = c.t_id
left join score s on c.c_id = s.c_id
left join stu on s.s_id = stu.id;
8.union:去重
union all:不去重
注:如果需求需要去重,只能用union;如果需求不需要去重,用union all;如果需求本身不存在重复数据,使用两者的效果是相同的
9.笛卡尔积:当省略条件无效、连接条件无效、所有表中的所有行相互连接时会产生
10.排序:(1)全局排序(order by):只有一个reducer
①使用order by子句排序:asc(升序)、desc(降序)
②order by子句在select语句的结尾
eg. 查询员工信息按工资降序排列
hive(default) > select * from emp order by sal desc;
(2)每个reduce内部排序(sort by):sort by为每个reducer产生一个排序文件。每个reducer内部进行排序,对全局结果来说不是排序:①设置reduce个数:hive(default) > set mapreduce.job.r
educes=3;
②查看设置reduce个数:hive(default) > set mapreduce.job.redu
ces;
③根据部门编号降序查看员工信息:
hive(default) > select * from emp sort by deptno desc;
④将查询结果导入到文件中:
hive(default) > insert overwrite local directory 路径名
select * from emp sort by deptno desc;
(3)分区(distribute by):在有些情况下,我们需要控制某个特定行应该到哪个reducer,通常是为了进行后续的聚集操作。distribute by子句可以做这件事。distribute by类似MR中partition(自定义分区),进行分区,结合sort by使用。
注:对于distribute by进行测试时,一定要分配多reduce进行处理,否则无法看到distribute by的效果