博客 / 詳情

返回

【趙渝強老師】Hive的分區表

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兩個字段來創建動態分區。
user avatar bintools 頭像 bytebase 頭像
2 位用戶收藏了這個故事!

發佈 評論

Some HTML is okay.