当前位置 博文首页 > 大数据manor的博客 :??Hive的基本知识(二)Hive中的各种表??

    大数据manor的博客 :??Hive的基本知识(二)Hive中的各种表??

    作者:[db:作者] 时间:2021-09-13 09:51

    在这里插入图片描述

    🌹内部表:

    内部表也称为被Hive拥有和管理的托管表(Managed table)。默认情况下创建的表就是内部表,Hive拥有该表的结构和文件。换句话说,Hive完全管理表(元数据和数据)的生命周期,类似于RDBMS中的表。当您删除内部表时,它会删除数据以及表的元数据。

    🌹外部表:

    外部表中的数据不是Hive拥有或管理的,只管理表元数据的生命周期。要创建一个外部表,需要使用EXTERNAL语法关键字。删除外部表只会删除元数据,而不会删除实际数据。在Hive外部仍然可以访问

    实际数据。

    内部表、外部表差异:

    无论内部表还是外部表,Hive都在Hive Metastore中管理表定义及其分区信息。删除内部表会从

    Metastore中删除表元数据,还会从HDFS中删除其所有数据/文件。删除外部表,只会从Metastore中删

    除表的元数据,并保持HDFS位置中的实际数据不变。

    🌹分区表:

    当Hive表对应的数据量大、文件多时,为了避免查询时全表扫描数据,Hive支持根据用户指定的字段进

    行分区,分区的字段可以是日期、地域、种类等具有标识意义的字段,分区字段不能是表中已经存在的字段,分区表的关键字为PARTITIONED BY

    静态分区:指的是分区的字段值是由用户在加载数据的时候手动指定的

    语法如下:

    动态分区:指的是分区的字段值是基于查询结果自动推断出来的

    启用hive动态分区,需要在hive会话中设置两个参数:

    set hive.exec.dynamic.partition=true; //开启动态分区功能
    
    set hive.exec.dynamic.partition.mode=nonstrict;//指定动态分区的模式,分为nonstick非严格模式和strict严格模式,strict严格模式要求至少有一个分区为静态分区。
    

    核心语法就是insert+select

    创建一张新的分区表t_all_hero_part_dynamic

    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、 分桶表数据进行抽样

    cs