自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Hive中的內(nèi)部表、外部表、分區(qū)表和分桶表

大數(shù)據(jù)
在Hive數(shù)據(jù)倉庫中,重要點就是Hive中的四個表。Hive 中的表分為內(nèi)部表、外部表、分區(qū)表和分桶表。Hive 也會刪除這個表中數(shù)據(jù)。管理表不適合和其他工具共享數(shù)據(jù)。

[[393935]]

在Hive數(shù)據(jù)倉庫中,重要點就是Hive中的四個表。Hive 中的表分為內(nèi)部表、外部表、分區(qū)表和分桶表。

內(nèi)部表

默認(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)建命令

  1. CREATE TABLE emp( 
  2.     empno INT
  3.     ename STRING, 
  4.     job STRING, 
  5.     mgr INT
  6.     hiredate TIMESTAMP
  7.     sal DECIMAL(7,2), 
  8.     comm DECIMAL(7,2), 
  9.     deptno INT
  10.     ROW FORMAT DELIMITED FIELDS TERMINATED BY "\t"-- 分隔符\t 

外部表

外部表稱之為EXTERNAL_TABLE;其實就是,在創(chuàng)建表時可以自己指定目錄位置(LOCATION);如果刪除外部表時,只會刪除元數(shù)據(jù)不會刪除表數(shù)據(jù);

具體的外部表創(chuàng)建命令,比內(nèi)部表多一個LOCATION而已。

  1. CREATE EXTERNAL TABLE emp_external( 
  2.   empno INT
  3.   ename STRING, 
  4.   job STRING, 
  5.   mgr INT
  6.   hiredate TIMESTAMP
  7.   sal DECIMAL(7,2), 
  8.   comm DECIMAL(7,2), 
  9.   deptno INT
  10.   ROW FORMAT DELIMITED FIELDS TERMINATED BY "\t" 
  11.   LOCATION '/hive/emp_external'

「內(nèi)部表和外部表的區(qū)別:」

  • 創(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ū)表

分區(qū)表實際上就是對應(yīng)一個 HDFS 文件系統(tǒng)上的獨(dú)立的文件夾,該文件夾下是該分區(qū)所有的數(shù)據(jù)文件。Hive 中的分區(qū)就是分目錄,把一個大的數(shù)據(jù)集根據(jù)業(yè)務(wù)需要分割成小的數(shù)據(jù)集。在查詢時通過 WHERE 子句中的表達(dá)式選擇查詢所需要的指定的分區(qū),這樣的查詢效率會提高很多。

具體的分區(qū)表創(chuàng)建命令如下,比外部表多一個PARTITIONED。PARTITIONED英文意思就是分區(qū)的,需要指定表中的其中一個字段,這個就是根據(jù)該字段的不同,劃分不同的文件夾。

  1. CREATE EXTERNAL TABLE emp_partition( 
  2.   empno INT
  3.   ename STRING, 
  4.   job STRING, 
  5.   mgr INT
  6.   hiredate TIMESTAMP
  7.   sal DECIMAL(7,2), 
  8.   comm DECIMAL(7,2) 
  9.   ) 
  10.   PARTITIONED BY (deptno INT)   -- 按照部門編號進(jìn)行分區(qū) 
  11.   ROW FORMAT DELIMITED FIELDS TERMINATED BY "\t" 
  12.   LOCATION '/hive/emp_partition'

分桶表

分區(qū)在HDFS上的表現(xiàn)形式是一個目錄,分桶則是一個單獨(dú)的文件。分桶則是指定分桶表的某一列,讓該列數(shù)據(jù)按照哈希取模的方式隨機(jī)、均勻地分發(fā)到各個桶文件中。

具體的分桶表創(chuàng)建命令如下,比分區(qū)表的不同在于CLUSTERED。CLUSTERED英文意思就是群集的。分桶操作和分區(qū)一樣,需要根據(jù)某一列具體數(shù)據(jù)來進(jìn)行哈希取模操作,故指定的分桶列必須基于表中的某一列(字段)

  1. CREATE EXTERNAL TABLE emp_bucket( 
  2.   empno INT
  3.   ename STRING, 
  4.   job STRING, 
  5.   mgr INT
  6.   hiredate TIMESTAMP
  7.   sal DECIMAL(7,2), 
  8.   comm DECIMAL(7,2), 
  9.   deptno INT
  10.   CLUSTERED BY(empno) SORTED BY(empno ASCINTO 4 BUCKETS  --按照員工編號散列到四個 bucket 中 
  11.   ROW FORMAT DELIMITED FIELDS TERMINATED BY "\t" 
  12.   LOCATION '/hive/emp_bucket'

「分區(qū)表和分桶表的區(qū)別:」

Hive 數(shù)據(jù)表可以根據(jù)某些字段進(jìn)行分區(qū)操作,細(xì)化數(shù)據(jù)管理,可以讓部分查詢更快。同時表和分區(qū)也可以進(jìn)一步被劃分為 Buckets,分桶表的原理和 MapReduce 編程中的 HashPartitioner 的原理類似;分區(qū)和分桶都是細(xì)化數(shù)據(jù)管理,但是分區(qū)表是手動添加區(qū)分,由于 Hive 是讀模式,所以對添加進(jìn)分區(qū)的數(shù)據(jù)不做模式校驗,分桶表中的數(shù)據(jù)是按照某些分桶字段進(jìn)行 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,因此分桶的時間是比較長的,因為要進(jìn)行MapReduce操作。

根據(jù)上面命令,成功創(chuàng)建了內(nèi)部表、外部表、分區(qū)表和分桶表。


下面依次插入數(shù)據(jù)到四張表,emp.txt具體內(nèi)容如下:

  1. 7369 SMITH CLERK 7902 1980-12-17 00:00:00 800.00  20 
  2. 7499 ALLEN SALESMAN 7698 1981-02-20 00:00:00 1600.00 300.00 30 
  3. 7521 WARD SALESMAN 7698 1981-02-22 00:00:00 1250.00 500.00 30 
  4. 7566 JONES MANAGER 7839 1981-04-02 00:00:00 2975.00  20 
  5. 7654 MARTIN SALESMAN 7698 1981-09-28 00:00:00 1250.00 1400.00 30 
  6. 7698 BLAKE MANAGER 7839 1981-05-01 00:00:00 2850.00  30 
  7. 7782 CLARK MANAGER 7839 1981-06-09 00:00:00 2450.00  10 
  8. 7788 SCOTT ANALYST 7566 1987-04-19 00:00:00 1500.00  20 
  9. 7839 KING PRESIDENT  1981-11-17 00:00:00 5000.00  10 
  10. 7844 TURNER SALESMAN 7698 1981-09-08 00:00:00 1500.00 0.00 30 
  11. 7876 ADAMS CLERK 7788 1987-05-23 00:00:00 1100.00  20 
  12. 7900 JAMES CLERK 7698 1981-12-03 00:00:00 950.00  30 
  13. 7902 FORD ANALYST 7566 1981-12-03 00:00:00 3000.00  20 
  14. 7934 MILLER CLERK 7782 1982-01-23 00:00:00 1300.00  10 

具體的插入數(shù)據(jù)命令如下所示:

  1. ## 內(nèi)部表 
  2. load data local inpath "emp.txt" into table emp; 
  3. ## 外部表 
  4. load data local inpath "emp.txt" into table emp_external; 
  5. ## 分區(qū)表 
  6. LOAD DATA LOCAL INPATH "emp.txt" OVERWRITE INTO TABLE emp_partition PARTITION (deptno=10); 
  7. LOAD DATA LOCAL INPATH "emp.txt" OVERWRITE INTO TABLE emp_partition PARTITION (deptno=20); 
  8. LOAD DATA LOCAL INPATH "emp.txt" OVERWRITE INTO TABLE emp_partition PARTITION (deptno=30); 
  9. ## 分桶表 
  10. -- 啟用桶表 
  11. set hive.enforce.bucketing=true
  12. -- 限制對桶表進(jìn)行l(wèi)oad操作 
  13. set hive.strict.checks.bucketing = true
  14. INSERT INTO TABLE emp_bucket SELECT *  FROM emp;  --這里的 emp 表就是一張普通的雇員表 

每次向桶表進(jìn)行INSERT操作,其實都需要創(chuàng)建中間表。

 

責(zé)任編輯:姜華 來源: Python之王
相關(guān)推薦

2023-10-11 13:42:21

2009-06-24 10:26:41

Oracle約束分區(qū)表

2021-01-20 08:07:52

oracle分區(qū)單表

2010-10-11 10:16:17

Mysql分區(qū)表

2010-11-22 15:06:46

MySQL分區(qū)表

2017-08-30 16:59:54

PostgreSQL分區(qū)表

2022-01-11 08:46:56

Oracle 在線重定義數(shù)據(jù)庫

2010-10-11 09:50:32

Mysql分區(qū)表

2009-08-17 08:35:22

Linux掛載分區(qū)表fstab

2021-09-07 17:54:04

OpenGauss分區(qū)表索引

2011-03-29 13:22:07

SQL Server臨時表表變量

2009-06-25 10:25:39

SQL Server

2011-03-22 14:57:52

Oracle數(shù)據(jù)庫普通表分區(qū)表

2011-08-23 10:37:15

Oracle分區(qū)表本地索引

2023-05-03 22:09:02

Hive分區(qū)工具,

2010-04-19 14:01:22

Oracle查看分區(qū)表

2011-07-20 16:03:06

SQL Server數(shù)分區(qū)表

2010-11-10 14:47:11

SQL Server創(chuàng)

2021-03-08 22:22:20

MySQL分區(qū)表SQL

2010-09-16 14:13:11

SQL Server系
點贊
收藏

51CTO技術(shù)棧公眾號