顾名思义,只查询出满足左边表的数据:
select e.* from employee e LEFT SEMI-JOIN salary s on e.user_id=s.userid; 结果: 1 zhangsas 1 2 lisi 2 3 wangwu 3 4 tom 1 5 lily 2 6 amy 3 7 lilei 1左半开连接时内连接的优化,当左边表的一条数据,在右边表中存在时,Hive就停止扫描。因此效率比join高,但是左半开连接的select和where关键字后面只能出现左边表的字段,不能出现右边表的字段。
Hive不支持右半开连接。
笛卡尔JOIN笛卡尔积连接的结果是将左边表的数据乘以右边表的数据:
select e.user_id,e.username,s.salarys from employee e join salary s;上面SQL执行的结果就是employee表的记录乘以salary表的记录。
map-side JOIN连接map端连接,按道理来说不算是Hive连接的一种,它是对Hive SQL的优化,Hive是将SQL转化为MpaReduce job,因此Map端连接对应的就是Hadoop Join连接中的Map端连接,将小表加载到内存中,以提高hive sql的执行速度。
可以通过下面两种方式使用Hive SQL map 端join连接:
使用/* + MAPJOIN*/标记:
select /*+ MAPJOIN*(d)*/ e.username,e.dept_id,d.dept_name,d.dept_id from employee e join dept d on e.dept_id = d.dept_id;设置hive.auto,convert.JOIN的值为true。
总结:
1、本文总结了Hive SQL中各种join连接的用法和使用场景。
2、使用inner join内连接时如何减少MapReduce的个数。
3、如何在Hive SQL中使用Map端连接。
4、如何使用嵌套查询优化SQL。