Hive中的內(nèi)部表、外部表、分區(qū)表和分桶表
在Hive數(shù)據(jù)倉(cāng)庫(kù)中,重要點(diǎn)就是Hive中的四個(gè)表。Hive 中的表分為內(nèi)部表、外部表、分區(qū)表和分桶表。
內(nèi)部表
默認(rèn)創(chuàng)建的表都是所謂的內(nèi)部表,有時(shí)也被稱為管理表。因?yàn)檫@種表,Hive 會(huì)(或多或少地)控制著數(shù)據(jù)的生命周期。Hive 默認(rèn)情況下會(huì)將這些表的數(shù)據(jù)存儲(chǔ)在由配置項(xiàng)hive.metastore.warehouse.dir(例如,/user/hive/warehouse)所定義的目錄的子目錄下。當(dāng)我們刪除一個(gè)管理表時(shí),Hive 也會(huì)刪除這個(gè)表中數(shù)據(jù)。管理表不適合和其他工具共享數(shù)據(jù)。
具體的內(nèi)部表創(chuàng)建命令
- CREATE TABLE emp(
 - empno INT,
 - ename STRING,
 - job STRING,
 - mgr INT,
 - hiredate TIMESTAMP,
 - sal DECIMAL(7,2),
 - comm DECIMAL(7,2),
 - deptno INT)
 - ROW FORMAT DELIMITED FIELDS TERMINATED BY "\t"; -- 分隔符\t
 
外部表
外部表稱之為EXTERNAL_TABLE;其實(shí)就是,在創(chuàng)建表時(shí)可以自己指定目錄位置(LOCATION);如果刪除外部表時(shí),只會(huì)刪除元數(shù)據(jù)不會(huì)刪除表數(shù)據(jù);
具體的外部表創(chuàng)建命令,比內(nèi)部表多一個(gè)LOCATION而已。
- CREATE EXTERNAL TABLE emp_external(
 - empno INT,
 - ename STRING,
 - job STRING,
 - mgr INT,
 - hiredate TIMESTAMP,
 - sal DECIMAL(7,2),
 - comm DECIMAL(7,2),
 - deptno INT)
 - ROW FORMAT DELIMITED FIELDS TERMINATED BY "\t"
 - LOCATION '/hive/emp_external';
 
「內(nèi)部表和外部表的區(qū)別:」
- 創(chuàng)建內(nèi)部表時(shí):會(huì)將數(shù)據(jù)移動(dòng)到數(shù)據(jù)倉(cāng)庫(kù)指向的路徑;
 - 創(chuàng)建外部表時(shí):僅記錄數(shù)據(jù)所在路徑,不對(duì)數(shù)據(jù)的位置做出改變;
 - 刪除內(nèi)部表時(shí):刪除表元數(shù)據(jù)和數(shù)據(jù);
 - 刪除外部表時(shí),刪除元數(shù)據(jù),不刪除數(shù)據(jù)。
 
分區(qū)表
分區(qū)表實(shí)際上就是對(duì)應(yīng)一個(gè) HDFS 文件系統(tǒng)上的獨(dú)立的文件夾,該文件夾下是該分區(qū)所有的數(shù)據(jù)文件。Hive 中的分區(qū)就是分目錄,把一個(gè)大的數(shù)據(jù)集根據(jù)業(yè)務(wù)需要分割成小的數(shù)據(jù)集。在查詢時(shí)通過(guò) WHERE 子句中的表達(dá)式選擇查詢所需要的指定的分區(qū),這樣的查詢效率會(huì)提高很多。
具體的分區(qū)表創(chuàng)建命令如下,比外部表多一個(gè)PARTITIONED。PARTITIONED英文意思就是分區(qū)的,需要指定表中的其中一個(gè)字段,這個(gè)就是根據(jù)該字段的不同,劃分不同的文件夾。
- CREATE EXTERNAL TABLE emp_partition(
 - empno INT,
 - ename STRING,
 - job STRING,
 - mgr INT,
 - hiredate TIMESTAMP,
 - sal DECIMAL(7,2),
 - comm DECIMAL(7,2)
 - )
 - PARTITIONED BY (deptno INT) -- 按照部門編號(hào)進(jìn)行分區(qū)
 - ROW FORMAT DELIMITED FIELDS TERMINATED BY "\t"
 - LOCATION '/hive/emp_partition';
 
分桶表
分區(qū)在HDFS上的表現(xiàn)形式是一個(gè)目錄,分桶則是一個(gè)單獨(dú)的文件。分桶則是指定分桶表的某一列,讓該列數(shù)據(jù)按照哈希取模的方式隨機(jī)、均勻地分發(fā)到各個(gè)桶文件中。
具體的分桶表創(chuàng)建命令如下,比分區(qū)表的不同在于CLUSTERED。CLUSTERED英文意思就是群集的。分桶操作和分區(qū)一樣,需要根據(jù)某一列具體數(shù)據(jù)來(lái)進(jìn)行哈希取模操作,故指定的分桶列必須基于表中的某一列(字段)
- CREATE EXTERNAL TABLE emp_bucket(
 - empno INT,
 - ename STRING,
 - job STRING,
 - mgr INT,
 - hiredate TIMESTAMP,
 - sal DECIMAL(7,2),
 - comm DECIMAL(7,2),
 - deptno INT)
 - CLUSTERED BY(empno) SORTED BY(empno ASC) INTO 4 BUCKETS --按照員工編號(hào)散列到四個(gè) bucket 中
 - ROW FORMAT DELIMITED FIELDS TERMINATED BY "\t"
 - LOCATION '/hive/emp_bucket';
 
「分區(qū)表和分桶表的區(qū)別:」
Hive 數(shù)據(jù)表可以根據(jù)某些字段進(jìn)行分區(qū)操作,細(xì)化數(shù)據(jù)管理,可以讓部分查詢更快。同時(shí)表和分區(qū)也可以進(jìn)一步被劃分為 Buckets,分桶表的原理和 MapReduce 編程中的 HashPartitioner 的原理類似;分區(qū)和分桶都是細(xì)化數(shù)據(jù)管理,但是分區(qū)表是手動(dòng)添加區(qū)分,由于 Hive 是讀模式,所以對(duì)添加進(jìn)分區(qū)的數(shù)據(jù)不做模式校驗(yàn),分桶表中的數(shù)據(jù)是按照某些分桶字段進(jìn)行 hash 散列形成的多個(gè)文件,所以數(shù)據(jù)的準(zhǔn)確性也高很多。
分桶表的建表有三種方式:直接建表,CREATE TABLE LIKE 和 CREATE TABLE AS SELECT
- 注:不能直接向桶表中加載數(shù)據(jù),需要使用insert語(yǔ)句插入數(shù)據(jù),因此只要見(jiàn)到load data 到桶表的,基本是亂來(lái)的。分桶表的數(shù)據(jù)通常只能使用 CTAS(CREATE TABLE AS SELECT) 方式插入,因?yàn)?CTAS 操作會(huì)觸發(fā) MapReduce,因此分桶的時(shí)間是比較長(zhǎng)的,因?yàn)橐M(jìn)行MapReduce操作。
 
根據(jù)上面命令,成功創(chuàng)建了內(nèi)部表、外部表、分區(qū)表和分桶表。

下面依次插入數(shù)據(jù)到四張表,emp.txt具體內(nèi)容如下:
- 7369 SMITH CLERK 7902 1980-12-17 00:00:00 800.00 20
 - 7499 ALLEN SALESMAN 7698 1981-02-20 00:00:00 1600.00 300.00 30
 - 7521 WARD SALESMAN 7698 1981-02-22 00:00:00 1250.00 500.00 30
 - 7566 JONES MANAGER 7839 1981-04-02 00:00:00 2975.00 20
 - 7654 MARTIN SALESMAN 7698 1981-09-28 00:00:00 1250.00 1400.00 30
 - 7698 BLAKE MANAGER 7839 1981-05-01 00:00:00 2850.00 30
 - 7782 CLARK MANAGER 7839 1981-06-09 00:00:00 2450.00 10
 - 7788 SCOTT ANALYST 7566 1987-04-19 00:00:00 1500.00 20
 - 7839 KING PRESIDENT 1981-11-17 00:00:00 5000.00 10
 - 7844 TURNER SALESMAN 7698 1981-09-08 00:00:00 1500.00 0.00 30
 - 7876 ADAMS CLERK 7788 1987-05-23 00:00:00 1100.00 20
 - 7900 JAMES CLERK 7698 1981-12-03 00:00:00 950.00 30
 - 7902 FORD ANALYST 7566 1981-12-03 00:00:00 3000.00 20
 - 7934 MILLER CLERK 7782 1982-01-23 00:00:00 1300.00 10
 
具體的插入數(shù)據(jù)命令如下所示:
- ## 內(nèi)部表
 - load data local inpath "emp.txt" into table emp;
 - ## 外部表
 - load data local inpath "emp.txt" into table emp_external;
 - ## 分區(qū)表
 - LOAD DATA LOCAL INPATH "emp.txt" OVERWRITE INTO TABLE emp_partition PARTITION (deptno=10);
 - LOAD DATA LOCAL INPATH "emp.txt" OVERWRITE INTO TABLE emp_partition PARTITION (deptno=20);
 - LOAD DATA LOCAL INPATH "emp.txt" OVERWRITE INTO TABLE emp_partition PARTITION (deptno=30);
 - ## 分桶表
 - -- 啟用桶表
 - set hive.enforce.bucketing=true;
 - -- 限制對(duì)桶表進(jìn)行l(wèi)oad操作
 - set hive.strict.checks.bucketing = true;
 - INSERT INTO TABLE emp_bucket SELECT * FROM emp; --這里的 emp 表就是一張普通的雇員表
 
每次向桶表進(jìn)行INSERT操作,其實(shí)都需要?jiǎng)?chuàng)建中間表。

















 
 
 


 
 
 
 