• Hive数据定义语言-DDL-建表高阶语法(内外部、分区、分桶、事务、视图、物化视图)



    1. 内部表、外部表

    1.1 内部表

    • 默认情况下创建的表就是内部表。

    • 删除内部表时,会删除数据以及表的元数据。
      在这里插入图片描述

    • 可以使用DESCRIBE FORMATTED tablename来获取表的元数据描述信息,从中可以看出表的类型。
      在这里插入图片描述

    1.2 外部表

    • 外部表中的数据不是Hive拥有或管理的。

    • 创建一个外部表,需要使用EXTERNAL语法关键字。

    • 删除外部表只会删除元数据,而不会删除实际数据。
      在这里插入图片描述

    • 可以使用DESCRIBE FORMATTED tablename来获取表的元数据描述信息,从中可以看出表的类型。
      在这里插入图片描述

    1.3 内、外部表差异

    • 两者,Hive都在Hive Metastore中管理定义、字段类型等元数据信息。
    • 删除内部表时,会从Metastore中删除表元数据,还会从HDFS中删除其所有数据文件。
    • 删除外部表时,只会从Metastore中删除表的元数据,并保持HDFS位置中的实际数据不变。

    1.4 Location关键字的作用

    • 创建外部表不指定location,由默认参数控制

    2. 分区表-Partitioned Tables

    2.1 概念

    • 当Hive表对应的数据量大、文件个数多时,为了避免查询时全表扫描数据,Hive支持根据指定的字段对表进行分区。
      在这里插入图片描述

    2.2 创建

    • 分区表语法
      在这里插入图片描述

    注意:分区字段不能是表中已经存在的字段,因为分区字段最终也会以虚拟字段的形式显示再表结构上

    • 实例示范:
      在这里插入图片描述

    2.3 分区表数据加载

    2.3.1 静态分区

    • 静态分区指的是分区属性值是由用户再加载数据的时候手动指定的。
    • 语法如下:

    在这里插入图片描述

    Local参数用于指定待加载的数据是位于本地系统还是HDFS文件系统。

    2.3.2 动态分区

    • 动态分区指的是分区的字段值是基于查询结果(参数位置)自动推断出来的。核心语法是insert+select
    • 启动hive动态分区,需要在hive会话中设置两个参数:
      在这里插入图片描述
    • 实例示范:
      在这里插入图片描述

    2.4 注意事项

    一、分区表不是建表的比要语法规则,是一种优化手段表,可选;
    二、分区字段不能是表中已有的字段,不能重复;
    三、分区字段是虚拟字段,其数据并不存储在底层的文件中;
    四、分区字段值的确定来于用户价值数据手动指定(静态分区)或者根据查询结果位置自动推断(动态分区)
    五、Hive支持多重分区,也就是说在分区的基础上继续分区,划分更加细粒度。

    3. 分桶表-Bucketed Tables

    3.1 概念

    • 分桶表也叫做桶表,叫法源自建表语法中bucket单词,是一种用户优化查询而设计的表类型。
    • 分桶表对应的数据文件被拆分成若干个独立的小文件。
    • 在分桶时,要指定根据哪个字段将数据分为几桶
      在这里插入图片描述

    3.2 规则

    • 分桶规则如下:桶编号相同的数据会被分到同一个桶当中。
      在这里插入图片描述
      在这里插入图片描述

    3.3 语法

    在这里插入图片描述

    • CLUSTERED BY (col_name)表示根据哪个字段进行分;
    • INTO N BUCKETS表示分为几桶(也就是几个部分)。
    • 注意:分桶的字段必须是表中已经存在的字段。
      在这里插入图片描述
    • 实例示范:
      在这里插入图片描述
      在这里插入图片描述

    3. 事务表-Transactional Tables

    3.1 局限性

    • 尚不支持BEGIN,COMMIT和ROLLBACK。所有语言操作都是自动提交的。
    • 仅支持ORC文件格式(STORED AS ORC)
    • 默认情况下事务配置为关闭。需要配置参数开启使用。
    • 表必须是分桶表才可以使用事务功能。
    • 表参数transactional必须为true;
    • 外部表不能成为ACID表,不允许从非ACID会话读取/写入ACID表。

    3.2 配置开启事务、创建事务表

    在这里插入图片描述
    在这里插入图片描述

    4. 视图-Views

    4.1 概念

    • Hive中的视图(view)是一种虚拟表,只保存定义,不实际存储数据。
    • 通常从真实的物理表查询中创建生成视图,也可以从已经存在的视图上创建新视图。
    • 创建视图时,将冻结视图的架构,如果删除或更改基础表,则视图将失败。
    • 视图是用来简化操作的,不缓冲记录,也没有提高查询性能。

    4.2 语法

    • 创建视图:
    create view <viewname> as select ... from <tablename> limit ...;
    
    • 1
    • 显示当前已有的视图
    show tables;
    show views;--hive v2.2.0之后支持
    
    • 1
    • 2
    • 视图的查询使用
    select * from <viewname>;
    
    • 1
    • 查看视图定义
    show create table <viewname>;
    
    • 1
    • 删除视图
    drop view <viewname>;
    
    • 1
    • 更改视图属性
    alter view <viewname> set TBLPROPERTIED('comment'='This is a view');
    
    • 1
    • 更改视图定义
    alter view <viewname> as select ... from <tablename> limit ...;
    
    • 1

    5. 物化视图-Materialized Views

    5.1 概念

    • 物化视图是一个包括查询结果的数据库对象,可以用于预先计算并保存表连接或聚集等耗时较多的操作的结果。在执行查询时,就可以避免进行这些耗时的操作,而从快速的得到结果
    • 使用物化视图的目的就是通过预计算,提高查询性能

    5.2 物化视图、视图区别

    • 视图是需您的,逻辑存在的,只有定义没有存储数据。
    • 物化视图是真实的,物理存在的,里面存储着预计算的数据。

    5.3 语法

    在这里插入图片描述

  • 相关阅读:
    常见端口及其脆弱点
    洗地机哪个好用?2023年洗地机推荐指南
    幼儿园门禁安全教程,新手直接套用
    八年测开经验面试28K公司后,吐血整理出高频面试题和答案
    Java继承分析
    Python3 面向对象,一篇就够了
    学习笔记——路由网络基础——路由优先级(preference)
    2023 版 Java和python开发线性代数探索
    Android 开发常见问题
    Redis小记(一)
  • 原文地址:https://blog.csdn.net/Kox_233/article/details/128025738