數據準備
- 首先準備兩張表 員工表和部門表
員工表數據 表示員工姓名和所在部門
shy 銷售
zoom 銷售
penut 銷售
jack 測試
ning 測試
tom 開發
duke 開發
jkl 財務
rookie 財務
- 部門表數據 表示部門名稱和部門負責人
銷售 馬雲
測試 馬化騰
開發 李彥宏
算法 雷軍
- 在hive中創建兩張表
-- 員工表
create external table person
(
name string,
dep string
) row format delimited fields terminated by ' ';
-- 部門表
create external table dept
(
dep string,
own string
) row format delimited fields terminated by ' ';
- 加載數據
load data local inpath '/root/user.txt' overwrite table person;
load data local inpath '/root/dept.txt' into table dept;
笛卡爾積
- 首先我們試一下,直接通過join將兩個表連接進行查詢 select p.name,p.dep,d.own from person p join dept d;
- 可以發現取的是兩個表的笛卡爾積,後面的各種join其實就是以多種不同的方法從笛卡爾積裏面篩選數據。
shy 銷售 馬雲
shy 銷售 馬化騰
shy 銷售 李彥宏
shy 銷售 雷軍
zoom 銷售 馬雲
zoom 銷售 馬化騰
zoom 銷售 李彥宏
zoom 銷售 雷軍
penut 銷售 馬雲
penut 銷售 馬化騰
penut 銷售 李彥宏
penut 銷售 雷軍
jack 測試 馬雲
jack 測試 馬化騰
jack 測試 李彥宏
jack 測試 雷軍
ning 測試 馬雲
ning 測試 馬化騰
ning 測試 李彥宏
ning 測試 雷軍
tom 開發 馬雲
tom 開發 馬化騰
tom 開發 李彥宏
tom 開發 雷軍
duke 開發 馬雲
duke 開發 馬化騰
duke 開發 李彥宏
duke 開發 雷軍
jkl 財務 馬雲
jkl 財務 馬化騰
jkl 財務 李彥宏
jkl 財務 雷軍
rookie 財務 馬雲
rookie 財務 馬化騰
rookie 財務 李彥宏
rookie 財務 雷軍
等值join(內連接)
- Hive支持通常的SQL JOIN語句,但是隻支持等值連接,不支持非等值連接。等值連接就是查出兩個表某個字段值相等的數據,兩個表的空數據都會去除。
- 將兩個表根據部門進行等值join 查詢每個員工名稱 部門以及它對應部門負責人的名稱
select p.name,p.dep,d.own from person p join dept d on p.dep=d.dep;
- 可以發現原本表person中財務部門是獨有的,表dept中算法部門是獨有的,經過等值連接,財務部門和算法部門相關數據都去除了,說明等值join取的是交。
shy 銷售 馬雲
zoom 銷售 馬雲
penut 銷售 馬雲
jack 測試 馬化騰
ning 測試 馬化騰
tom 開發 李彥宏
duke 開發 李彥宏
左外連接
- 左外連接:JOIN操作符左邊表中符合連接條件的所有記錄將會被返回。 右邊表有匹配數據就輸出,沒有就補null。
select p.name,p.dep,d.own from person p left join dept d on p.dep=d.dep;
- 此時person表的財務部門信息是有的,而dept表的算法部門就沒有了
shy 銷售 馬雲
zoom 銷售 馬雲
penut 銷售 馬雲
jack 測試 馬化騰
ning 測試 馬化騰
tom 開發 李彥宏
duke 開發 李彥宏
jkl 財務 NULL
rookie 財務 NULL
右外連接
-
右外連接:JOIN操作符右邊表中符合連接條件的所有記錄將會被返回。 左邊表有匹配數據就輸出,沒有就補null。
select p.name,p.dep,d.own from person p right join dept d on p.dep=d.dep; -
此時person表的財務部門信息沒有了,而dept表的算法部門信息保留
shy 銷售 馬雲
zoom 銷售 馬雲
penut 銷售 馬雲
jack 測試 馬化騰
ning 測試 馬化騰
tom 開發 李彥宏
duke 開發 李彥宏
NULL NULL 雷軍
全外連接
- 全外連接中符合查詢條件的兩個表數據無論是否爲空都會保留
select p.name,p.dep,d.own from person p out join dept d on p.dep=d.dep;
- 結果如下,兩邊都可能會補null
ning 測試 馬化騰
jack 測試 馬化騰
NULL NULL 雷軍
rookie 財務 NULL
jkl 財務 NULL
penut 銷售 馬雲
zoom 銷售 馬雲
shy 銷售 馬雲
duke 開發 李彥宏
tom 開發 李彥宏
多表連接
- 注意:連接 n個表,至少需要n-1個連接條件。例如:連接三個表,至少需要兩個連接條件。
- 一般情況下,hive會給每個join對象啓動一個mapreduce job進行執行,但是對於3個及以上的多表join,join有所優化,如果每個join的子句on裏的連接鍵一樣,mr會啓動一個job完成所有表的join.此外,多表進行join時,一般要把大表放到最後面,這樣可以提高效率。