内部表:
内部表也称为被Hive拥有和管理的托管表(Managed table)。默认情况下创建的表就是内部表,Hive拥有该表的结构和文件。换句话说,Hive完全管理表(元数据和数据)的生命周期,类似于RDBMS中的表。当您删除内部表时,它会删除数据以及表的元数据。
外部表:
外部表中的数据不是Hive拥有或管理的,只管理表元数据的生命周期。要创建一个外部表,需要使用EXTERNAL语法关键字。删除外部表只会删除元数据,而不会删除实际数据。在Hive外部仍然可以访问
实际数据。
内部表、外部表差异:
无论内部表还是外部表,Hive都在Hive Metastore中管理表定义及其分区信息。删除内部表会从
Metastore中删除表元数据,还会从HDFS中删除其所有数据/文件。删除外部表,只会从Metastore中删
除表的元数据,并保持HDFS位置中的实际数据不变。
分区表:
当Hive表对应的数据量大、文件多时,为了避免查询时全表扫描数据,Hive支持根据用户指定的字段进
行分区,分区的字段可以是日期、地域、种类等具有标识意义的字段,分区字段不能是表中已经存在的字段,分区表的关键字为PARTITIONED BY
静态分区:指的是分区的字段值是由用户在加载数据的时候手动指定的
语法如下:
动态分区:指的是分区的字段值是基于查询结果自动推断出来的
启用hive动态分区,需要在hive会话中设置两个参数:
代码语言:javascript复制set hive.exec.dynamic.partition=true; //开启动态分区功能
set hive.exec.dynamic.partition.mode=nonstrict;//指定动态分区的模式,分为nonstick非严格模式和strict严格模式,strict严格模式要求至少有一个分区为静态分区。
核心语法就是insert select
创建一张新的分区表t_all_hero_part_dynamic
代码语言:javascript复制load data [local] inpath ' ' into table tablename partition(分区字段='分区
值'...);
create table t_all_hero_part_dynamic(
id int,
name string,
hp_max int,
mp_max int,
attack_max int,
defense_max int,
attack_range string,
role_main string,
role_assist string
) partitioned by (role string)
row format delimited
fields terminated by "t";执行动态分区插入
分区表的注意事项:
一、 分区表不是建表的必要语法规则,是一种优化手段表,可选;
二、 分区字段不能是表中已有的字段,不能重复;
三、 分区字段是虚拟字段,其数据并不存储在底层的文件中;
四、 分区字段值的确定来自于用户价值数据手动指定(静态分区)或者根据查询结果位置自动推断
(动态分区)
五、 Hive支持多重分区,也就是说在分区的基础上继续分区,划分更加细粒度
分桶表:
分桶表也叫做桶表,源自建表语法中bucket单词。是一种用于优化查询而设计的表类型。该功能可以让
数据分解为若干个部分易于管理
语法:
其中CLUSTERED BY (col_name)表示根据哪个字段进行分;INTO N BUCKETS表示分为几桶(也就是几
个部分)。需要注意的是,分桶的字段必须是表中已经存在的字段。
开启分桶的功能 ,从Hive2.0开始不再需要设置:
分桶表的使用好处:
1、 基于分桶字段查询时,减少全表扫描
2、 JOIN时可以提高MR程序效率,减少笛卡尔积数量
3、 分桶表数据进行抽样