本篇內(nèi)容介紹了“Hive中的內(nèi)部表、外部表、分區(qū)表和分桶表的區(qū)別”的有關(guān)知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!
站在用戶的角度思考問題,與客戶深入溝通,找到峰峰礦網(wǎng)站設(shè)計與峰峰礦網(wǎng)站推廣的解決方案,憑借多年的經(jīng)驗,讓設(shè)計與互聯(lián)網(wǎng)技術(shù)結(jié)合,創(chuàng)造個性化、用戶體驗好的作品,建站類型包括:網(wǎng)站制作、成都網(wǎng)站制作、企業(yè)官網(wǎng)、英文網(wǎng)站、手機端網(wǎng)站、網(wǎng)站推廣、域名與空間、網(wǎng)站空間、企業(yè)郵箱。業(yè)務(wù)覆蓋峰峰礦地區(qū)。
在Hive數(shù)據(jù)倉庫中,重要點就是Hive中的四個表。Hive 中的表分為內(nèi)部表、外部表、分區(qū)表和分桶表。
默認(rèn)創(chuàng)建的表都是所謂的內(nèi)部表,有時也被稱為管理表。因為這種表,Hive 會(或多或少地)控制著數(shù)據(jù)的生命周期。Hive 默認(rèn)情況下會將這些表的數(shù)據(jù)存儲在由配置項hive.metastore.warehouse.dir(例如,/user/hive/warehouse)所定義的目錄的子目錄下。當(dāng)我們刪除一個管理表時,Hive 也會刪除這個表中數(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;其實就是,在創(chuàng)建表時可以自己指定目錄位置(LOCATION);如果刪除外部表時,只會刪除元數(shù)據(jù)不會刪除表數(shù)據(jù);
具體的外部表創(chuàng)建命令,比內(nèi)部表多一個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';
創(chuàng)建內(nèi)部表時:會將數(shù)據(jù)移動到數(shù)據(jù)倉庫指向的路徑;
創(chuàng)建外部表時:僅記錄數(shù)據(jù)所在路徑,不對數(shù)據(jù)的位置做出改變;
刪除內(nèi)部表時:刪除表元數(shù)據(jù)和數(shù)據(jù);
刪除外部表時,刪除元數(shù)據(jù),不刪除數(shù)據(jù)。
分區(qū)表實際上就是對應(yīng)一個 HDFS 文件系統(tǒng)上的獨立的文件夾,該文件夾下是該分區(qū)所有的數(shù)據(jù)文件。Hive 中的分區(qū)就是分目錄,把一個大的數(shù)據(jù)集根據(jù)業(yè)務(wù)需要分割成小的數(shù)據(jù)集。在查詢時通過 WHERE 子句中的表達式選擇查詢所需要的指定的分區(qū),這樣的查詢效率會提高很多。
具體的分區(qū)表創(chuàng)建命令如下,比外部表多一個PARTITIONED。PARTITIONED英文意思就是分區(qū)的,需要指定表中的其中一個字段,這個就是根據(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) -- 按照部門編號進行分區(qū) ROW FORMAT DELIMITED FIELDS TERMINATED BY "\t" LOCATION '/hive/emp_partition';
分區(qū)在HDFS上的表現(xiàn)形式是一個目錄,分桶則是一個單獨的文件。分桶則是指定分桶表的某一列,讓該列數(shù)據(jù)按照哈希取模的方式隨機、均勻地分發(fā)到各個桶文件中。
具體的分桶表創(chuàng)建命令如下,比分區(qū)表的不同在于CLUSTERED。CLUSTERED英文意思就是群集的。分桶操作和分區(qū)一樣,需要根據(jù)某一列具體數(shù)據(jù)來進行哈希取模操作,故指定的分桶列必須基于表中的某一列(字段)
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 --按照員工編號散列到四個 bucket 中 ROW FORMAT DELIMITED FIELDS TERMINATED BY "\t" LOCATION '/hive/emp_bucket';
Hive 數(shù)據(jù)表可以根據(jù)某些字段進行分區(qū)操作,細(xì)化數(shù)據(jù)管理,可以讓部分查詢更快。同時表和分區(qū)也可以進一步被劃分為 Buckets,分桶表的原理和 MapReduce 編程中的 HashPartitioner 的原理類似;分區(qū)和分桶都是細(xì)化數(shù)據(jù)管理,但是分區(qū)表是手動添加區(qū)分,由于 Hive 是讀模式,所以對添加進分區(qū)的數(shù)據(jù)不做模式校驗,分桶表中的數(shù)據(jù)是按照某些分桶字段進行 hash 散列形成的多個文件,所以數(shù)據(jù)的準(zhǔn)確性也高很多。
分桶表的建表有三種方式:直接建表,CREATE TABLE LIKE 和 CREATE TABLE AS SELECT
注:不能直接向桶表中加載數(shù)據(jù),需要使用insert語句插入數(shù)據(jù),因此只要見到load data 到桶表的,基本是亂來的。分桶表的數(shù)據(jù)通常只能使用 CTAS(CREATE TABLE AS SELECT) 方式插入,因為 CTAS 操作會觸發(fā) MapReduce,因此分桶的時間是比較長的,因為要進行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; -- 限制對桶表進行l(wèi)oad操作 set hive.strict.checks.bucketing = true; INSERT INTO TABLE emp_bucket SELECT * FROM emp; --這里的 emp 表就是一張普通的雇員表
每次向桶表進行INSERT操作,其實都需要創(chuàng)建中間表。
“Hive中的內(nèi)部表、外部表、分區(qū)表和分桶表的區(qū)別”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識可以關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實用文章!