Apache Hive—join操作

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條記錄。
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章