等值Join
Hive支持通常的SQL JOIN語句,但是隻支持等值連接,不支持非等值連接。
案例實操
- 根據員工表和部門表中的部門編號相等,查詢員工編號、員工名稱和部門名稱;
hive (default)> select e.empno, e.ename, d.deptno, d.dname from emp e join dept d on e.deptno = d.deptno;
表的別名
好處
- 使用別名可以簡化查詢。
- 使用表名前綴可以提高執行效率。
案例實操
合併員工表和部門表
hive (default)> select e.empno, e.ename, d.deptno from emp e join dept d on e.deptno = d.deptno;
內連接
內連接:只有進行連接的兩個表中都存在與連接條件相匹配的數據纔會被保留下來。
hive (default)> select e.empno, e.ename, d.deptno from emp e join dept d on e.deptno = d.deptno;
左外連接
左外連接:JOIN操作符左邊表中符合WHERE子句的所有記錄將會被返回
hive (default)> select e.empno, e.ename, d.deptno from emp e left join dept d on e.deptno = d.deptno;
右外連接
右外連接:JOIN操作符右邊表中符合WHERE子句的所有記錄將會被返回
hive (default)> select e.empno, e.ename, d.deptno from emp e right join dept d on e.deptno = d.deptno;
滿外連接
滿外連接:將會返回所有表中符合WHERE語句條件的所有記錄。如果任一表的指定字段沒有符合條件的值的話,那麼就使用NULL值替代
hive (default)> select e.empno, e.ename, d.deptno from emp e full join dept d on e.deptno = d.deptno;
多表連接
注意:連接 n個表,至少需要n-1個連接條件。例如:連接三個表,至少需要兩個連接條件。
數據準備
1700 Beijing
1800 London
1900 Tokyo
- 創建位置表
create table if not exists location(
loc int,
loc_name string
)
row format delimited fields terminated by '\t';
- 導入數據
hive (default)> load data local inpath '/opt/module/datas/location.txt' into table location;
- 多表連接查詢
hive (default)>SELECT e.ename, d.dname, l.loc_name
FROM emp e
JOIN dept d
ON d.deptno = e.deptno
JOIN location l
ON d.loc = l.loc;
大多數情況下,Hive會對每對JOIN連接對象啓動一個MapReduce任務。本例中會首先啓動一個MapReduce job對錶e和表d進行連接操作,然後會再啓動一個MapReduce job將第一個MapReduce job的輸出和表l;進行連接操作。
注意:爲什麼不是表d和表l先進行連接操作呢?這是因爲Hive總是按照從左到右的順序執行的。
優化:當對3個或者更多表進行join連接時,如果每個on子句都使用相同的連接鍵的話,那麼只會產生一個MapReduce job。
笛卡爾積
笛卡爾集會在下面條件下產生
- 省略連接條件
- 連接條件無效
- 所有表中的所有行互相連接
案例實操
hive (default)> select empno, dname from emp,dept;
連接謂詞中不支持or
hive join目前不支持在on子句中使用謂詞or
hive (default)> select e.empno, e.ename, d.deptno from emp e join dept d on e.deptno = d.deptno or e.ename=d.ename; 錯誤的
簡書:https://www.jianshu.com/u/0278602aea1d
CSDN:https://blog.csdn.net/u012387141