Hive中的内部表、外部表、分区表和分桶表

大数据 2023-07-05 17:29:38
33阅读

在Hive数据库管理中,关键点便是Hive中的四个表。Hive 中的表分成內部表、外界表、分区表和分桶表。

內部表

默认设置建立的表全是说白了的內部表,有时候也被称作管理方法表。由于这类表,Hive 会(多多少少地)操纵着数据信息的生命期。Hive 默认设置状况下能将这种表的数据储存在由配备项hive.metastore.warehouse.dir(比如,/user/hive/warehouse)所界定的文件目录的根目录下。在我们删掉一个管理方法表时,Hive 也会删掉这一表中数据。管理方法表不宜和别的专用工具共享资源数据信息。

实际的內部表建立指令

 
  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;实际上便是,在创建表时能够自身特定文件目录部位(LOCATION);假如删掉外界表时,总是删掉数据库不容易删除表数据;

实际的外界表建立指令,比內部表多一个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'

「內部表和外界表的差别:」

  • 建立內部表时:会将数据信息挪动到数据库管理偏向的途径;
  • 建立外界表时:仅纪录数据信息所属途径,不对数据信息的部位作出更改;
  • 删掉內部表时:删除表数据库和数据信息;
  • 删掉外界表时,删掉数据库,不删掉数据信息。

分区表

分区表事实上便是相匹配一个 HDFS 系统文件上的单独的文件夹名称,该文件夹名称下是该系统分区全部的数据库文件。Hive 中的系统分区便是分文件目录,把一个大的数据依据业务流程必须切分成小的数据。在查看时根据 WHERE 子句中的关系式挑选查看所必须的特定的系统分区,那样的查看高效率会提升许多。

实际的分区表建立指令以下,比外界表多一个PARTITIONED。PARTITIONED英文意思便是系统分区的,必须特定表格中的在其中一个字段名,这一便是依据该字段名的不一样,区划不一样的文件夹名称。

 
  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)   -- 依照单位序号开展系统分区 
  11.   ROW FORMAT DELIMITED FIELDS TERMINATED BY "\t" 
  12.   LOCATION '/hive/emp_partition'

分桶表

系统分区在HDFS上的表达形式是一个文件目录,分桶则是一个独立的文档。分桶则是特定分桶表的某一列,让该列数据信息依照hach牙模型的方法任意、匀称地派发到每个桶文档中。

实际的分桶表建立指令以下,比分区表的不一样取决于CLUSTERED。CLUSTERED英文意思便是集群的。分桶实际操作和系统分区一样,必须依据某一列实际数据信息来开展hach牙模型实际操作,故特定的分桶列务必根据表格中的某一列(字段名)

 
  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'

「分区表和分桶表的差别:」

Hive 数据分析表能够依据一些字段名开展系统分区实际操作,优化数据库管理,能够让一部分查看更快。另外表和系统分区还可以进一步被区划为 Buckets,分桶表的基本原理和 MapReduce 程序编写中的 HashPartitioner 的基本原理相近;系统分区和分桶全是优化数据库管理,可是分区表是手动式加上区别,因为 Hive 是读方式,因此 对加上进系统分区的数据信息不做方式校检,分桶表中的数据信息是依照一些分桶字段名开展 hash 散列产生的好几个文档,因此 数据信息的精确性也高许多。

分桶表的建表有三种方法:立即建表,CREATE TABLE LIKE 和 CREATE TABLE AS SELECT

  • 注:不可以立即向桶表中载入数据信息,必须应用insert句子插进数据信息,因而只需看到load data 到桶表的,基本上是乱来的。分桶表的数据信息一般只有应用 CTAS(CREATE TABLE AS SELECT) 方法插进,由于 CTAS 实际操作会开启 MapReduce,因而分桶的时间较为长的,由于要开展MapReduce实际操作。

依据上边指令,取得成功建立了內部表、外界表、分区表和分桶表。


下边先后插进数据信息到四张表,emp.txt主要内容以下:

 
  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 

实际的插进数据信息指令以下所显示:

 
  1. ## 內部表 
  2. load data local inpath "emp.txt" into table emp; 
  3. ## 外界表 
  4. load data local inpath "emp.txt" into table emp_external; 
  5. ## 分区表 
  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. -- 限定对桶表开展load实际操作 
  13. set hive.strict.checks.bucketing = true
  14. INSERT INTO TABLE emp_bucket SELECT *  FROM emp;  --这儿的 emp 表便是一张一般的员工表 

每一次向桶表开展INSERT实际操作,实际上都必须建立正中间表。

the end
免责声明:本文不代表本站的观点和立场,如有侵权请联系本站删除!本站仅提供信息存储空间服务。