hive join查詢

數據準備

  • 首先準備兩張表 員工表和部門表
    員工表數據 表示員工姓名和所在部門
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時,一般要把大表放到最後面,這樣可以提高效率。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章