• Hive【内部表、外部表、临时表、分区表、分桶表】【总结】


    目录

    Hive的物种表结构特性

     一、内部表

    建表

    使用场景

     二、外部表

    建表:关键词【EXTERNAL】

    场景:

    外部表与内部表可互相转换

     三、临时表

    建表

     临时表横向对比​编辑

    四、分区表

    建表:关键字【PARTITIONED BY】

    场景:

    五、分桶表

    背景

    建表

     分区表和分桶表结合使用

    Hive的物种表结构特性

    1. 内部表:当删除内部表时,HDFS上的数据以及元数据都会被删除;
    2. 外部表:当删除外部表时,HDFS上的数据不会被删除,但是元数据会被删除;
    3. 临时表:在当前会话期间存在,会话结束时自动消失;
    4. 分区表:将一批数据按照一定的字段或者关键字为多个目录进行存储;
    5. 分桶表:将一批数据按照指定好的字段和桶的数量,对指定字段的数据取模运算,分成不同的桶进行存储,方便随机取样以及join等操作。

     一、内部表

    建表

    1. --方式一:正式建表
    2. CREATE TABLE `hdw_dim.dim_city_info_df`(
    3. city_id STRING COMMENT '城市id'
    4. ,city_name STRING COMMENT '城市名称'
    5. ,provice_id STRING COMMENT '省份id'
    6. ,provice_name STRING COMMENT '省份名称'
    7. )
    8. COMMENT '城市信息维表'
    9. PARTITIONED BY (
    10. `pdate` STRING COMMENT '天分区'
    11. )
    12. STORED AS orc
    13. TBLPROPERTIES (
    14. 'creator'='210XXXXX',
    15. 'orc.compress'='SNAPPY',
    16. 'ttl' = '30'
    17. );
    18. --方式二:仿照现有的表建表
    19. create table hdw_dim.dim_city_info_tmp like hdw_dim.dim_city_info_df;
    20. --方式三:根据查询结果自动创建表并且插入数据
    21. create table dw_dim.dim_city_info_tmp1 as dw_dim.dim_city_info_tmp

    使用场景

    1. ETL数据清理时用内部表做中间表,清理时HDFS上的文件同步删除;
    2. 在误删的情况下,数据易回溯,用内部表;
    3. 统计分析时,不涉及数据共享数据的情况;
    4. 需要对元数据和表数据进行管理时。

     二、外部表

    建表:关键词【EXTERNAL】

    1. CREATE EXTERNAL TABLE `hdw_dim.dim_city_info_df`(
    2. city_id STRING COMMENT '城市id'
    3. ,city_name STRING COMMENT '城市名称'
    4. ,provice_id STRING COMMENT '省份id'
    5. ,provice_name STRING COMMENT '省份名称'
    6. )
    7. COMMENT '城市信息维表'
    8. PARTITIONED BY (
    9. `pdate` STRING COMMENT '天分区'
    10. )
    11. STORED AS orc
    12. TBLPROPERTIES (
    13. 'creator'='210XXXXX',
    14. 'orc.compress'='SNAPPY',
    15. 'ttl' = '30'
    16. );

    场景:

    • 建议在ods层使用外部表
    1. 外部表不会加载数据到Hive的默认仓库,减少数据的传输,同时还能和其他外部表共享数据;
    2. 使用外部表,Hive不会修改源数据,不用担心数据损坏或者丢失;
    3. Hive在删除外部表时,删除的只是表结构,而不会删除数据;
    • 在对于恢复巫山数据有困难的情况,比如:实时采集的数据;

    外部表与内部表可互相转换

    1. --查看表类型
    2. desc formatted address
    3. --将内部表修改为外部表
    4. alter table address set tblproperties('EXTERNAL' = 'TRUE');
    5. --将外部表修改为内部表
    6. alter table address set tblproperties('EXTERNAL' = 'FALSE');

     三、临时表

    建表

    1. --方式一:TEMPORARY
    2. create temporary table `hdw_dim.dim_city_info`(
    3. city_id STRING COMMENT '城市id'
    4. ,city_name STRING COMMENT '城市名称'
    5. ,provice_id STRING COMMENT '省份id'
    6. ,provice_name STRING COMMENT '省份名称'
    7. )
    8. COMMENT '城市信息维表'
    9. --方式二:with as
    10. with t1 as
    11. (
    12. select
    13. *
    14. from hdw_dim.dim_city_info
    15. where provice_name = '山东省'
    16. ) ,
    17. t2 as
    18. (
    19. select
    20. *
    21. from hdw_dim.dim_city_info
    22. where provice_name = '北京市'
    23. )
    24. --方式三:真实建表,用完手动删除
    25. create table hdw_tmp.tmp_city_info as
    26. select
    27. *
    28. from hdw_dim.dim_city_info;
    29. drop table if exists hdw_tmp.tmp_city_info

     临时表横向对比

    四、分区表

    分区是HDFS上表目录的子目录,数据按照分区存储在子目录中。如果查询的where子句中包含分区条件,则直接从该分区查找,而不是扫描整个目录,合理的分区可以极大的提高查询速度和性能。

    建表:关键字【PARTITIONED BY】

    1. CREATE EXTERNAL TABLE emp_partition
    2. (
    3. empno INT,
    4. ename STRING,
    5. job STRING,
    6. mgr INT,
    7. hiredate TIMESTAMP,
    8. sal DECIMAL(7,2),
    9. comm DECIMAL(7,2)
    10. )
    11. PARTITIONED BY (deptno INT) -- 按照部门编号进行分区
    12. ROW FORMAT DELIMITED FIELDS TERMINATED BY "\t"
    13. LOCATION '/hive/emp_partition';

    场景:

    在数据仓库管理大规模数据集的时候都需要进行分区,比如将日志文件按天进行分区,从而保证数据细粒度的划分,使得查询性能得到提升。

    查看分区目录

    hadoop fs -ls  hdfs://hadoop001:8020/hive/emp_partition/

    五、分桶表

    背景

    分区提供了一个隔离数据和优化查询的可行性方案,但是并非所有的数据集都可以形成合理的分区,分区的数量也不是越多越好,过多的分区条件可能导致很多分区上没有数据。同时hive会限制动态分区可以创建最大的分区数,用来避免过多的文件对文件系统产生负担。

            鉴于以上原因,Hive还提供了一种更细粒度的数据拆分方案:分桶表(bucket Table)。分桶表会将指定的列的值进行哈希散列,并对bucket(桶数量)取余,然后存储到对应的bucket中。

    建表

    1. CREATE EXTERNAL TABLE emp_bucket
    2. (
    3. empno INT,
    4. ename STRING,
    5. job STRING,
    6. mgr INT,
    7. hiredate TIMESTAMP,
    8. sal DECIMAL(7,2),
    9. comm DECIMAL(7,2),
    10. deptno INT
    11. )
    12. CLUSTERED BY(empno)
    13. SORTED BY(empno ASC) INTO 4 BUCKETS --按照员工编号散列到四个 bucket 中
    14. ROW FORMAT DELIMITED FIELDS TERMINATED BY "\t"
    15. LOCATION '/hive/emp_bucket';

     分区表和分桶表结合使用

    分区表和分桶表的本质都是将数据按照不同粒度进行拆分,从而使得在查询的时候不必扫描全表,只需要扫描对应的分区或分桶,从而提升查询的效率。两者可以结合使用,从而保证数据在不同粒度上都能得到合理的拆分,官方示例如下:

    1. CREATE TABLE page_view_bucketed
    2. (
    3. viewTime INT,
    4. userid BIGINT,
    5. page_url STRING,
    6. referrer_url STRING,
    7. ip STRING
    8. )
    9. PARTITIONED BY(dt STRING)
    10. CLUSTERED BY(userid)
    11. SORTED BY(viewTime) INTO 32 BUCKETS ROW FORMAT DELIMITED
    12. FIELDS TERMINATED BY '\001'
    13. COLLECTION ITEMS TERMINATED BY '\002'
    14. MAP KEYS TERMINATED BY '\003'
    15. STORED AS SEQUENCEFILE;

  • 相关阅读:
    【AIGC专题】Stable Diffusion 从入门到企业级实战0403
    Pytorch lr_scheduler.LambdaLR()的简单理解与用法
    android上架之获取平台公钥、签名 MD5 值
    第十四届蓝桥杯校内模拟赛(第二期)题解分享
    git 基础之分支操作(三)
    3. 微服务之nacos服务注册发现
    Hexo自定义修改文章访问地址
    ChatGPT模型api的python调用
    1.4k star 项目 CMakeTutorial 阅读和点评
    [Codeforces] number theory (R1200) Part.10
  • 原文地址:https://blog.csdn.net/xiayuhaisong/article/details/136165372