一、在多表查詢的時候,由於表與表之間有關聯性,所有hive提供了join的語法,基本類似sql的join語法。主要分為以下五類:
1. 內連線(join)
2. 外鏈結( [outer] join)
3. 半連線(left semi join)
4. 笛卡爾連線(cross join)
5. 其他連線方式(eg. mapjoin等)
語法格式:
left_table_reference [join type] right_table_ref [join_condition]* ([join type] right_table_ref [join_condition])
二、使用join時的建議和問題
1. 等值連線:hive中的所有連線條件必須為等值連線條件,不支援<>等非等值連線方式。
2. 多表連線:多表連線的時候,一般先進行left semi join,然後再進行join, 再進行外連線。(減少資料量)。
3. join過濾條件,可以將where的過濾條件移動到join的過濾條件中去,這樣可以減少網路資料量。
4. join執行順序都是從左到右,不管是那種join方式,那麼一般將大的表放到右邊,這樣可以節省記憶體&減少網路傳輸。
5. mapjoin只適合連線表是小表的情況,是一種空間換時間的解決方案。
三、內連線語法
內連線(join)主要作用是獲取連線的兩張表全部匹配的資料,如果不給定join_condition的話,會進行笛卡爾乘積。笛卡爾連線(cross join)和內連線語法一樣,區別在於:笛卡爾連線是對內連線的一種優化。語法格式為:
table_reference [cross] join table_factor [join_condition]
四、外連線語法
外連線的主要作用是保留一部分沒有匹配的資料。左外連線(left outer join)的結果是包括左表中的所有行,如果左表中的某乙個行在右表中不存在,那麼則在相關聯的結果集中右表的所有選擇列值均設定為空值。右外連線(right outer join)就是左外連線的反先連線,將返回右表的所有行,左表進行空值填充。全外連線(full outer join)返回左表和右表的所有行,關聯表中沒有匹配值的直接設定為空值。語法格式為:
table_reference [outer] join table_factor join_condition
五、hive特有的半連線語法,left semi join
半連線(left semi join)是hive特有的,hive中不支援in/exists操作,所以hive提供了乙個替代方案。需要注意的是,被連線的表(右表),不能出現在查詢列/其他部分(where等)中,只能出現在on字句中。(出現也是無效的)。提出半連線的主要作用其實是提高查詢效率,真正來講的話,hive中可以使用其他連線方式來代替半連線,但是就效率而已的話,還是半連線比較高效。語法格式:
table_reference left semi join table_factor join_condition
七、join語法例項:
classes表資料:
1,班級1
2,班級2
3,班級3
student表資料
11,1,張三
12,1,李四
13,1,王五
21,2,tom
22,2,gerry
23,2,simon
24,2,jim
91,\n,jeffrey
92,\n,leo
93,\n,even
94,\n,aaron
95,\n,addison
內連線語法:
1.獲取學生和班級之間完全匹配的資料。
select students.*,classes.* from classes join students on classes.classid=students.classid;
----------
select students.*,classes.* from classes cross
join students on classes.classid=students.classid;
select students.*, classes.* from students left
join classes on students.classid = classes.classid;
獲取全部班級的學生資訊,如果某個班級沒有學生,那麼學生資訊顯示為null。(作業2)
select * from students right
join classes on students.classid=classes.classid;
獲取全部資訊,如果沒有匹配資料的顯示null。(作業3)
select * from students full
join classes on students.classid=classes.classid;
半連線:
1. 獲取學生表中班級id在班級表中的所有學生資訊。
sql: select students.* from students where classid in (select
distinct classid from classes);
原hql: select students.* from students join classes on students.classid = classes.classid;
新hql: select students.* from students left semi join classes on students.classid=classes.classid;
mapjoin:
select /*+ mapjoin(classes) */ * from students join classes on students.classid=classes.classid;
Hive JOIN實現過程
準備資料 語句 select a.uid,a.name,b.age from logs a join users b on a.uid b.uid 我們希望的結果是把users表join進來獲取age欄位。hive select from logs oka蘋果5 a橙子3 b燒雞1 hive sel...
hive join語句優化
有兩種方法可以啟用它。1.是通過使用乙個注釋,mapjoin 小表 此c樣式注釋應放在select之後,它指示hive將別名 小表 載入到記憶體中。select mapjoin c from orders o join cities c on o.city id c.id 2.另一種開啟mapjoi...
幾種 hive join 型別簡介
作為資料分析中經常進行的join 操作,傳統dbms 資料庫已經將各種演算法優化到了極致,而對於hadoop 使用的mapreduce 所進行的join 操作,去年開始也是有各種不同的算 文出現,討論各種演算法的適用場景和取捨條件,本文討論hive 中出現的幾種join 優化,然後討論其他演算法實現...