目錄
Hive join
Hive中除了支持和傳統數據庫中一樣的內關聯、左關聯、右關聯、全關聯,還支持LEFT SEMI JOIN和CROSS JOIN,但這兩種JOIN類型也可以用前面的代替。
Hive支持等值連接(a.id=b.id),不支持非等值(a.id>b.id)的連接,因爲非等值連接非常難轉化到map/reduce任務。另外,Hive支持多2個以上表之間的join。
寫join查詢時,需要注意幾個關鍵點:
- join時,每次map/reduce任務的邏輯:
reducer會緩存join序列中除了最後一個表的所有表的記錄,再通過最後一個表將結果序列化到文件系統。這一實現有助於在reduce端減少內存的使用量。實踐中,應該把最大的那個表寫在最後(否則會因爲緩存浪費大量內存)。 - LEFT,RIGHT和FULL OUTER關鍵字用於處理join中空記錄的情況
SELECT a.val,b.val FROM a LEFT OUTER JOIN b ON (a.key=b.key)
對應所有a表中的記錄都有一條記錄輸出。輸出的結果應該是a.val,b.val,當a.key=b.key時,而當b.key中找不到等值的a.key記錄時也會輸出:
a.val, NULL
所以a表中的所有記錄都被保留了:
“a RIGHT OUTER JOIN b”會保留所有b表的記錄。 - join發生在WHERE子句之前
如果你想限制join的輸出,應該在WHERE子句中寫過濾條件——或是在join子句中寫。這裏面一個容易混淆的問題是表分區的情況:
SELECT a.val,b.val FROM a
LEFT OUTER JOIN b ON(a.key=b.key)
WHERE a.ds=‘2009-07-07’ AND b.ds=‘2009-07-07’
這會joina表到b表(OUTER JOIN),列出a.val和b.val的記錄。
join實操和數據準備
inner join:內連接,只有a.id=b.id纔會顯示出來,不相等不會顯示出來
先創建A表、B表
通過命令vi a.txt
準備數據a.txt
編輯後保存a.txt
通過命令vi b.txt
準備數據b.txt
編輯後保存b.txt
導入數據
確認數據是否導入成功
select * from a;
確認數據是否導入成功
select * from b;
join實驗
inner join:內連接
inner join:內連接,只有a.id=b.id纔會顯示出來,不相等不會顯示出來
開發環境可以開啓本地模式,線上環境一定不要開啓本地模式。
set hive.exec.mode.local.auto=true;
left join:左關聯(左外關聯),以左表爲準。
左表所有字段顯示出來,右表做關聯。如果關聯上,相等則顯示出來;如果關聯不上,顯示爲null。
right join:右關聯(右外關聯),以右表爲準。
把右表所有字段顯示出來,左表做關聯。如果關聯上,相等則顯示出來;如果關聯不上,顯示爲null。
full outer join:全關聯(全外關聯)
hive中的特別join:semi join
corss join(##慎用)
返回兩個表的笛卡爾積結果,不需要指定關聯鍵。
select a.*,b.* from a cross join b;
執行結果:
左表100條記錄,右表100條記錄,100*100=10000條記錄。