hive join語法介紹

2021-08-03 14:04:35 字數 3098 閱讀 6887

一、在多表查詢的時候,由於表與表之間有關聯性,所有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 優化,然後討論其他演算法實現...