1、內連接
hive> select b.*,a.name from userinfo2 b,userinfo a where a.userid=b.userid;
hive> select b.*,a.name from userinfo2 b join userinfo a on a.userid=b.userid;
2、外連接
#左聯
select b.*,a.name from userinfo2 b left join userinfo a on a.userid=b.userid; #右聯 hive> select a.*,b.name from userinfo b right join userinfo2 a on a.userid=b.userid;
全連接,兩邊都全顯示
hive> select a.*,b.name from userinfo b right join userinfo2 a on a.userid=b.userid;
3、半連接
hive> select * from userinfo2 a where a.userid in (select userid from userinfo); #left semi join必須遵守一個規則:右表(userinfo)只能在on子句里出現,也不能在where子句以及select中出現 hive> select * from userinfo2 a left semi join userinfo b on (a.userid=b.userid);
4、map連接
在之前的內聯查詢中: select b.*,a.name from userinfo2 b join userinfo a on a.userid=b.userid; 如果有一個連接表小到可以放入內存,例如userinfo表,hive就可以較小的表放入每個mapper的內存中來執行連接,這就是map連接。 執行這個查詢不使用reducer,因此這個查詢對right和full join無效,因為只有在對所有輸入上進行聚集的步驟(即reduce)才能檢測到哪個數據行無法匹配。 map連接可以利用分桶表,需要設置hive.optimize.bucketmapjoin=true
5、子查詢,Hive只支持在FROM子句中使用子查詢,子查詢必須有名字,並且列必須唯一:SELECT ... FROM(subquery) name ...
某些情況子查詢可以出現在where子句中,本文中第三點半連接就是子查詢,子查詢可以出現在where的in或者是exists中。
#子查詢的列名必須有唯一的列名。
hive> select year,avg(max_data) from (select year,max(data) as max_data from weather_data group by year) mt group by year;
