HIVE子查詢轉換成連線
阿新 • • 發佈:2018-12-17
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 |
這樣會導致左表資料產生分裂