Hive的分割槽表跟Oracle、MySQL中分割槽表的概念是一樣的。當表上建立了分割槽,就會根據分割槽的條件從物理儲存上將表中的資料進行分隔儲存。而當執行查詢語句時候,也會根據分割槽的條件掃描特定分割槽中的資料,從而避免全表掃描以提高查詢的效率。Hive分割槽表中的每個分割槽將會在HDFS上建立一個目錄,分割槽中的資料則是該目錄下的檔案。在執行查詢語句時,可以透過SQL的執行計劃瞭解到是否在查詢的時候掃描的特定的分割槽。影片講解如下:
https://www.bilibili.com/video/BV1ET42167Q3/?aid=1706316500&c...
注意:Hive的分割槽表具體又可以分為:靜態分割槽表和動態分割槽表。
一、【實戰】使用Hive的靜態分割槽表
靜態分割槽表需要在插入資料的時候顯式指定分割槽的條件。下面透過具體的步驟來演示如何建立並使用Hive的靜態分割槽表。影片講解如下:
https://www.bilibili.com/video/BV1gT421r7a8/?aid=1706485248&c...
(1)建立靜態分割槽表。
hive> create table emp_part
(empno int,
ename string,
job string,
mgr int,
hiredate string,
sal int,
comm int)
partitioned by (deptno int)
row format delimited fields terminated by ',';
(2)往靜態分割槽表中插入資料時,需要指定具體的分割槽條件。下面的語句使用了三條insert語句分別從內部表中查詢出了10、20和30號部門的員工資料,並插入到分割槽表中,如下圖所示。
hive> insert into table emp_part partition(deptno=10)
select empno,ename,job,mgr,hiredate,sal,comm from emp where deptno=10;
hive> insert into table emp_part partition(deptno=20)
select empno,ename,job,mgr,hiredate,sal,comm from emp where deptno=20;
hive> insert into table emp_part partition(deptno=30)
select empno,ename,job,mgr,hiredate,sal,comm from emp where deptno=30;
(3)透過explain語句檢視SQL的執行計劃,如查詢10號部門的員工資訊。透過執行計劃,可以看出掃描的資料量大小是118B。如下圖所示。
(4)下圖是查詢普通的內部表的執行計劃,可以看出掃描的資料量大小是6290B。
二、使用Hive的動態分割槽表
動態分割槽表則可以根據插入的資料動態建立分割槽。下面透過具體的步驟來演示如何建立並使用Hive的動態分割槽表。
注意:Hive的動態分割槽表預設使用最後一個欄位作為分割槽名,需要分割槽的欄位只能放在後面,不能把順序弄錯。向動態分割槽表中插入資料時,Hive是根據查詢欄位的位置推斷分割槽名的,而不是欄位名稱。
(1)啟動動態分割槽。
hive> set hive.exec.dynamic.partition =true;
hive> set hive.exec.dynamic.partition.mode = nonstrict;
注意:引數hive.exec.dynamic.partition的預設值是false,表示停用動態分割槽功能;引數hive.exec.dynamic.partition.mode的預設值是strict,表示必須有靜態分割槽欄位。
(2)據員工的job建立單欄位動態分割槽表。
hive> create table dynamic_part_emp
(empno int,ename string,sal int)
partitioned by (job string);
影片講解如下:
https://www.bilibili.com/video/BV1vM4m1y7G1/?aid=1306329087&c...
(3)向dynamic_part_emp分割槽表中插入資料。
hive> insert into table dynamic_part_emp
select empno,ename,sal,job from emp;
注意:這裡將會使用查詢語句的最後一個欄位job作為動態分割槽的條件。
(4)建立半自動分割槽表。
hive> create table dynamic_part_emp1
(empno int,ename string,sal int)
partitioned by (deptno int,job string);
影片講解如下:
https://www.bilibili.com/video/BV1DCe2efEoq/?aid=112840434320...
注意:半自動分割槽表是指部分欄位採用靜態分割槽,而另一部分自動採用動態分割槽,且靜態分割槽欄位要在動態分割槽前面。
(5)向dynamic_part_emp1分割槽表中插入資料。
hive> insert into table dynamic_part_emp1 partition(deptno=10,job)
select empno,ename,sal,job from emp where deptno=10;
注意:由於部門號deptno採用靜態分割槽,因此需要在插入資料的時候指定deptno作為靜態分割槽的條件;而這裡的job採用的動態分割槽。
(6)建立多欄位全動態分割槽表。
hive> create table dynamic_part_emp2
(empno int,ename string,sal int)
partitioned by (deptno int,job string);
影片講解如下:
https://www.bilibili.com/video/BV1kveReTEA8/?aid=112843873587...
(7)向dynamic_part_emp2分割槽表中插入資料。
hive> insert into table dynamic_part_emp2
select empno,ename,sal,deptno,job from emp;
注意:這裡會根據deptno和job兩個欄位來建立動態分割槽。