文章目录
- 内、外部表
- 1、内部表
- 2、外部表
- 3、内、外部表差异
- 分区表
- 1、概念
- 2、分区表数据加载——静态分区
- 3、分区表的本质
- 4、多重分区表
- 5、分区表数据加载——动态分区
- 6、分区表的注意事项
- 分桶表
- 1、概念
- 2、规则
- 3、语法
- 4、分桶优势
- 事物表
内、外部表
1、内部表
内部表(Internal table)也称为被Hive拥有和管理的托管表(Managed table)。在默认情况下创建的表就是内部表,Hive拥有该表的结构和文件。简而言之,Hive完全管理内部表。当您删除内部表时,它会删除数据以及表的元数据。
可以使用DESCRIBE FORMATTED tablename
,来获取表的元数据描述信息,从中可以看出表的类型。
2、外部表
(1)外部表的数据不是hive所拥有和管理的。hive只管理表元数据的生命周期。
(2)创建一个外部表需要使用external
语法关键字。
(3)删除外部表只会删除元数据,而不会删除实际数据。在Hive外部仍然可以访问实际数据。
(4)在实际场景中,外部表搭配location
语法指定数据的路径,可以数据更加安全,不指定路径就在默认路径下。
create extemal table student_ext(
num int,
name string,
age int
)
row format delimited
fields terminated by ','
location '/stu';
3、内、外部表差异
(1)无论内部表还是外部表,Hive都在Hive Metastore中管理表定义、字段类型等元数据信息。
(2)删除内部表时,除了会从Metastore中删除表元数据,还会从HDFS中删除其所有数据文件。
(3)删除外部表时,只会从Metastore中删除表的元数据,并保持HDFS位置中的实际数据不变。
项目 | 内部表 | 外部表 |
创建方式 | 默认情况下 | 使用external语法关键字 |
Hive管理范围 | 元数据、表数据 | 元数据 |
删除表结果 | 删除元数据,删除HDFS上文件数据 | 只会删除元数据 |
操作 | 支持ARCHIVE,UNARCHIVE,TRUNCATE,MERGE,CONCATENATE | 不支持 |
事务 | 支持ACID / 事务性 | 不支持 |
缓存 | 支持结果缓存 | 不支持 |
分区表
1、概念
(1)当Hive表对应的数据量大、文件个数多的时候,为了避免查询时全表的扫描数据,Hive支持根据指定字段对表进行分区,分区的字段可以是日期、地域等具有标识意义的字段。
(2)分区表的语法如下图红色标记,注意的是分区字段不能是表中已经存在的字段,因为分区字段最终也会以虚拟字段的形式显示在表结构上。
2、分区表数据加载——静态分区
(1)静态分区就是指:分区的属性值是由用户在加载数据的时候手动指定的;
(2)语法:load data [local] inpath 'filepath' into table tablename partition(分区字段=分区值...);
其中:Local参数用于指定待加载的数据是位于本地文件系统还是HDFS文件系统。
3、分区表的本质
- 分区的概念提供了一种将Hive表数据分离为多个文件/目录的方法;
- 不同分区对应着不同的文件夹,同一分区的数据存储在同一个文件夹下;
- 查询过滤的时候只需要根据分区值找到对应的文件夹,扫描本文件夹下本分区下的文件即可,避免全表数据扫描;
- 这种指定分区查询的方式叫做分区裁剪。
4、多重分区表
(1)Hive支持多个分区字段:PARTITIONED BY (partition1 data_type, partition2 data_type, …)。
(2)多重分区下,分区之间是一个递进关系,可以理解为在前一个分区的基础上继续分区;
(3)从HDFS的角度来看就是文件夹下继续划分子文件夹。比如:把学校学生人数数据首先根据年级分区,然后根据班进行划分……
5、分区表数据加载——动态分区
(1)动态分区:是指分区的字段是基于查询结果(参数位置)自动推断出来的,核心语法insert+select
。
(2)启动hive动态分区,需要在hive会话中设置两个参数:
- 是否开启动态分区功能:
set hive.exec.dynamic.partition = true
; - 指定动态分区模式,分为nonstick非严格模式和strict严格模式,strict严格模式要求至少有一个分区为静态分区:
set hive.exec.dynamic.partition.mode = nonstrict;
6、分区表的注意事项
(1)分区表不是建表的必要语法规则,是一种优化手段表,可选;
(2)分区字段不能是表中已有的字段,不能重复;
(3)分区字段是虚拟字段,其数据并不存储在底层的文件中;
(4)分区字段值的确定来自于用户价值数据手动指定(静态分区)或者根据查询结果位置自动推断(动态分区);
(5)Hive支持多重分区,也就是说在分区的基础上继续分区,划分更加细粒度。
分桶表
1、概念
(1)分桶表也叫做桶表,是一种用于优化查询而设计的表类型。
(2)分桶表对应的数据文件在底层会被分解为若干个部分,通俗来说就是被拆分成若干个独立的小文件。
(3)在分桶时,要指定根据哪个字段将数据分为几桶(几个部分)。
2、规则
分桶的规则:桶编号相同的数据会被分到同一个桶当中。
hash_function取决于分桶字段bucketing_column的类型:
- 如果是int类型,hash_function(int)== int;
- 如果是其他比如bigint,string或者复杂数据类型,hash_function比较棘手,将是从该类型派生的某个数字,比如hashcode值。
3、语法
(1)CLUSTERED BY(col_name)表示根据哪个字段进行分(必须是表中有的字段);
(2)INTO N BUCKETS表示分为几桶(也就是几个部分)。
4、分桶优势
(1)基于分桶查询,减少全表扫描;
(2)在进行join时可以提高MR程序效率,减少笛卡尔数量;
(3)分桶表数据进行高效抽样:当数据量特别大时,对全体数据进行处理存在困难时,抽样就显得尤其重要了。抽样可以从被抽取的数据中估计和推断出整体的特性,是科学实验、质量检验、社会调查普遍采用的一种经济有效的工作和研究方法。
事物表
Hive本身从设计之初时,就是不支持事务的,因为live的核心目标是将已经存在的结构化数据文件映射成为表,然后提供基于表的SQL分析处理,是一款面向分析的工具。且映射的数据通常存储于HDPS上,而HDPS是不支持随机修改文件数据的。
局限性:
- 尚不支持BEGIN,COMMIT和ROLLBACK,所有语言操作都是自动提交的;
- R支持ORC文件格式(STORED AS ORC);
- 默认情况下事务配置为关闭,需要配置参数开启使用;
- 表必须是分桶表(Bucketed)才可以使用事务功能;
- 表参数transactional必须为true;
- 外部表不能成为ACID表,不允许从非ACID会话读取/写入ACID表。