hive 連接(join)查詢


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;

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM