1. 程式人生 > >HIVE子查詢轉換成連線

HIVE子查詢轉換成連線

HIVE子查詢

在hive中進行子查詢,經常會報不支援子查詢的錯誤,導致有些sql可能在mysql中可以使用但是在hive中卻無法使用,因此在hive中可以採用連線替換子查詢的方式。

左半連線

hive有一種連線方式,叫做左半連線,關鍵字為:LEFT SEMI JOIN,這種連線方式與左連線類似,但是屬於一種查詢的方式。

教師表(teacher):

id name
1 小六
2 小七
3 小八
4 小九

授課表(course):

id course_name teacher_id
1 編譯原理 1
2 資料庫 1
3 作業系統 2
4 計算機網路 3

那麼對於mysql來說,我想要查詢有課程安排的老師,SQL可以這樣寫:

SELECT * FROM teacher
WHERE id IN (
	SELECT teacher_id FROM COURSE
);

這樣的子查詢(簡單舉例,這樣的子查詢在hive是支援的)我們在HIVE中轉換成如下的程式碼:

SELECT * FROM teacher T1
LEFT SEMI JOIN 
course T2
ON T1.id = T2.teacher_id

得到的結果就是:

id name
1 小六
2 小七
3 小八

實際上左半連線與連線有很大的差異,它並不會把右邊的資料展現出來。 左半連線使用的右表僅僅是一個篩選條件,而ON 就是替代了SQL種的IN的作用,右表就是in中的表。

注意

左半連線由於只有左表的資料,因此在連線外面是無法使用右表的欄位作為where條件的,對於整個語句來說,只有左表的欄位才是合法欄位。

和左連線的區別

左連線的話,如果關聯的key在右邊有多條資料,很有可能導致左表的資料產生分裂,例如本次的例子,改用左連線的結果:

id name id course_name
1 小六 1 編譯原理
1 小六 2 資料庫
2 小七 3 作業系統
3 小八 4 計算機網路
4 小九 NULL NULL

這樣會導致左表資料產生分裂