【Hive学习笔记】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表。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
THE END
分享
二维码
< <上一篇
下一篇>>