Hive Join的限制
只支持等值连接
Hive支持类似SQL Server的大部分Join操作,但是注意只支持等值连接,并不支持不等连接。原因是Hive语句最终是要转换为MapReduce程序来执行的,但是MapReduce程序很难实现这种不等判断的连接方式。
----等值连接
select lead.* from user_leads lead
left join user_info info
on lead.user_id=info.userid;
---不等连接(不支持)
select lead.* from user_leads lead
left join user_info info
on lead.user_id!=info.userid;
连接谓词中不支持or
---on 后面的表达式不支持or
select lead.* from user_leads lead
left join user_info info
on lead.user_id=info.userid or lead.leads_id=0;
Inner join
内连接同SQL Sever中的一样,连接的两个表中,只有同时满足连接条件的记录才会放入结果表中。
Left join
同SQL Server中一样,两个表左连接时,符合Where条件的左侧表的记录都会被保留下来,而符合On条件的右侧的表的记录才会被保留下来。
Right join
同Left Join相反,两个表左连接时,符合Where条件的右侧表的记录都会被保留下来,而符合On条件的左侧的表的记录才会被保留下来。
Full join
Full Join会将连接的两个表中的记录都保留下来。
Left Semi-Join ( exists 语句)
SQL Server中有exists语句,类似下面的语句,但是Hive中不支持 Exists语句。
--SQL Sever中的exists语句,但是hive中不支持
SELECT i.* FROM userInfo i
WHERE EXISTS (SELECT 1 FROM userScopeRelation s WHERE s.userInfoId=i.userInfoID AND s.CompanyID=i.CompanyID
)
对于这种需求,Hive使用Left Semi-Join(左半开连接)来解决。
SELECT i.* from userInfo i left semi-join userScopeRelation s
on i.userInfoId=s.userInfoId and i.CompanyID=s.CompanyID
但是这里注意,select 后面的列,不能有left semi-join右边表的字段,只能是左边表的字段。