Hive 之 查詢 02-join 語句

一、 只支持等值 join

Hive 支持通常的 SQL JOIN 語句, 但是【只支持等值連接】, 【不支持非等值連接】; 即只能使用 = 而不能使用 > 或 < 之類的符號作爲 on 後面條件的連接符號;

如:

hive (default)> select e.deptno, e.ename from emp e 
			  > join dept d on e.deptno = d.deptno;

... ...
OK
e.deptno	e.ename
20	SMITH
30	ALLEN
30	WARD
20	JONES
30	MARTIN
30	BLAKE
10	CLARK
20	SCOTT
10	KING
30	TURNER
20	ADAMS
30	JAMES
20	FORD
10	MILLER
Time taken: 30.413 seconds, Fetched: 14 row(s)

二、 表的別名

○ 使用別名可以簡化查詢;
○ 使用表名前綴可以調高查詢效率(在 join 中, 如: emp.deptno);

三、 內連接

內連接: 只有進行連接的【兩個表中】都存在與連接條件相匹配的數據, 纔會被保留下來;

如:

hive (default)> select e.deptno, e.ename from emp e 
			  > join dept d on e.deptno = d.deptno;

四、 左外連接

左外連接: join 操作符【左】邊表中符合 where 子句的所有記錄將會被返回;

如:

hive (default)> select e.deptno, e.ename from emp e 
			  > left join dept d on e.deptno = d.deptno;

... ...
OK
e.deptno	e.ename
20	SMITH
30	ALLEN
30	WARD
20	JONES
30	MARTIN
30	BLAKE
10	CLARK
20	SCOTT
10	KING
30	TURNER
20	ADAMS
30	JAMES
20	FORD
10	MILLER
Time taken: 28.288 seconds, Fetched: 14 row(s)

五、 右外連接

右外連接:join 操作符【右】邊表中符合 where 子句的所有記錄將會被返回;

如:

hive (default)> select e.deptno, e.ename, d.deptno from emp e 
			  > right join dept d on e.deptno = d.deptno;

... ...
OK
e.deptno	e.ename	d.deptno
10	CLARK	10
10	KING	10
10	MILLER	10
20	SMITH	20
20	JONES	20
20	SCOTT	20
20	ADAMS	20
20	FORD	20
30	ALLEN	30
30	WARD	30
30	MARTIN	30
30	BLAKE	30
30	TURNER	30
30	JAMES	30
NULL	NULL	40
Time taken: 16.075 seconds, Fetched: 15 row(s)

六、 滿外連接

滿外連接: 將會返回所有表中滿足 where 子句條件的所有記錄。 如果任一表的指定字段沒有符合條件的值的話, 就使用 Null 代替;

如:

hive (default)> select e.deptno, e.ename, d.deptno from emp e 
			  > full join dept d on e.deptno = d.deptno;

... ...
OK
e.deptno	e.ename	d.deptno
10	MILLER	10
10	KING	10
10	CLARK	10
20	ADAMS	20
20	SCOTT	20
20	SMITH	20
20	JONES	20
20	FORD	20
30	TURNER	30
30	ALLEN	30
30	BLAKE	30
30	MARTIN	30
30	WARD	30
30	JAMES	30
NULL	NULL	40
Time taken: 17.541 seconds, Fetched: 15 row(s)

4.7 多表連接

【注意】連接 n 個表, 至少需要 n-1 個連接條件。 例如, 連接三個表, 至少需要兩個連接條件;

創建表:

hive (default)> create table if not exists location(
	          > loc int, 
	          > loc_name string)
	          > row format delimited fields terminated by '\t';
OK
Time taken: 0.946 seconds

hive (default)> show tables;
OK
tab_name

... ...
location
... ...

Time taken: 0.127 seconds, Fetched: 10 row(s)

導入數據:

hive (default)> load data local inpath '/opt/module/data/loc.txt' 
			  > into table location;
Loading data to table default.location
Table default.location stats: [numFiles=1, totalSize=36]
OK
Time taken: 0.365 seconds

查看數據:

hive (default)> select * from location;
OK
location.loc	location.loc_name
1700	Beijing
1800	London
1900	Tokyo
Time taken: 0.129 seconds, Fetched: 3 row(s)

使用多表連接查詢:

hive (default)> select e.ename, d.deptno, l.loc_name from emp e 
              > join dept d
              > on e.deptno = d.deptno
              > join location l
              > on d.loc = l.loc;

... ...
OK
e.ename	d.deptno	l.loc_name
SMITH	20	London
ALLEN	30	Tokyo
WARD	30	Tokyo
JONES	20	London
MARTIN	30	Tokyo
BLAKE	30	Tokyo
CLARK	10	Beijing
SCOTT	20	London
KING	10	Beijing
TURNER	30	Tokyo
ADAMS	20	London
JAMES	30	Tokyo
FORD	20	London
MILLER	10	Beijing
Time taken: 18.635 seconds, Fetched: 14 row(s)

【注意】大多數情況下, Hive 會對每對 join 連接對象啓動一個 MapReduce 任務, 本例中會先啓動一個 MapReduce Job 對錶 e 和表 d 進行連接操作, 然後會再啓動一個 MapReduce Job 將第一個 MapReduce Job 的結果與表 l 進行連接操作。

爲什麼不是表 d 和表 l 先進行連接操作呢? 因爲 Hive 總是按照從左到右的順序執行;

八、 笛卡爾積

笛卡爾積會在下面的情況下產生:

  1. 省略連接條件;(多因爲這個條件而發生的笛卡爾積)
  2. 連接條件無效;
  3. 所有表中的所有行互相連接;

如:

hive(default)> select empno, dname from emp, dept;

... ...
OK
empno	dname
7369	ACCOUNTING
7369	RESEARCH
7369	SALES
7369	OPERATIONS
7499	ACCOUNTING
7499	RESEARCH
7499	SALES
7499	OPERATIONS
7521	ACCOUNTING
7521	RESEARCH
7521	SALES
7521	OPERATIONS
7566	ACCOUNTING
7566	RESEARCH
7566	SALES
7566	OPERATIONS
7654	ACCOUNTING
7654	RESEARCH
7654	SALES
7654	OPERATIONS
7698	ACCOUNTING
7698	RESEARCH
7698	SALES
7698	OPERATIONS
7782	ACCOUNTING
7782	RESEARCH
7782	SALES
7782	OPERATIONS
7788	ACCOUNTING
7788	RESEARCH
7788	SALES
7788	OPERATIONS
7839	ACCOUNTING
7839	RESEARCH
7839	SALES
7839	OPERATIONS
7844	ACCOUNTING
7844	RESEARCH
7844	SALES
7844	OPERATIONS
7876	ACCOUNTING
7876	RESEARCH
7876	SALES
7876	OPERATIONS
7900	ACCOUNTING
7900	RESEARCH
7900	SALES
7900	OPERATIONS
7902	ACCOUNTING
7902	RESEARCH
7902	SALES
7902	OPERATIONS
7934	ACCOUNTING
7934	RESEARCH
7934	SALES
7934	OPERATIONS
Time taken: 18.147 seconds, Fetched: 56 row(s)

一個表中有 14 條數據, 一個表中有 4 條數據, 結果由於省略了連接條件, 導致出現了 14*4 = 56 條數據;

【注】可以關閉笛卡爾積, 而且在編譯的時候, 是不會通過的;

九、 連接謂詞中不支持 or

如下面的語句就是錯誤的:

hive (default)>select e.ename, d.deptno from emp e
              > join dept d
              > on e.deptno = d.deptno
              > or 
              > e.ename = d.dname;
FAILED: SemanticException [Error 10019]: Line 3:3 OR not supported in JOIN currently 'dname'

【注】連接謂詞是 and 的話, 是支持的:(本例沒有符合條件的數據而已)

hive (default)> select e.ename, d.deptno from emp e
              > join dept d
              > on e.deptno = d.deptno
              > and 
              > e.ename = d.dname;
... ...
OK
e.ename	d.deptno
Time taken: 16.463 seconds
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章