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 總是按照從左到右的順序執行;
八、 笛卡爾積
笛卡爾積會在下面的情況下產生:
- 省略連接條件;(多因爲這個條件而發生的笛卡爾積)
- 連接條件無效;
- 所有表中的所有行互相連接;
如:
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