【趙渝強老師】Hive的分割槽表

赵渝强老师發表於2024-10-28

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;

image.png

(3)透過explain語句檢視SQL的執行計劃,如查詢10號部門的員工資訊。透過執行計劃,可以看出掃描的資料量大小是118B。如下圖所示。

image.png

(4)下圖是查詢普通的內部表的執行計劃,可以看出掃描的資料量大小是6290B。

image.png

二、使用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兩個欄位來建立動態分割槽。

相關文章