HiveQL视图


文章目录

  • HiveQL视图
  • 使用视图来限制基于条件过滤的数据
  • 动态分区中的视图和map类型
  • 视图其他相关



视图可以允许保存一个查询并像对待表一样对这个查询进行操作。这是一个逻辑结构,因为它不像一个表会存储数据。换句话说,Hive目前暂不支持物化视图。


当一个查询引用一个视图时,这个视图所定义的查询语句将和用户的查询语句组合在一起,然后供Hive制定查询计划。从逻辑上讲,可以想象为Hive先执行这个视图,然后使用这个结果进行余下后续的查询。

当查询变得长或者复杂的时候,通过使用视图将这个查询语句分割成多个小的、更可控的片段可以降低这种复杂度。

创建语句

create view view_name as select xxx...

使用视图来限制基于条件过滤的数据

数据库允许将视图作为一个安全机制,也就是不给用户直接访问具有敏感数据的原始表,而是提供一个带有where子句限制了的视图。

**但是Hive目前不支持这个功能。因为用户必须具有能够访问整个底层原始表的权限,才能执行视图的语句。**然而通过创建视图来限制数据访问可以用来保护信息不被随意查询。

动态分区中的视图和map类型

![[外链图片转存失败(img-bClOUc9L-1568856654168)(D:\学习笔记\Hive编程指南截图\保存图片\Hive中的表\11动态分区中的视图.jpg)]()

视图其他相关

  1. Hive会先解析视图,然后使用解析结果再来解析整个查询语句。然而,作为Hive查询优化器的一部分,查询语句和视图语句可能会合并成一个单一的实际查询语句。
  2. 定义一个视图实际上并不会 “具体化“ 操作任何实际数据,所以视图实际上是对其所使用到的表和列的一个查询语句固化过程。因此,如果视图所涉及的表或者列不再存在时,会导致视图查询失败。
  3. 一个视图的名称要和这个视图所在的数据库下的其他所有表和视图的名称不同。
  4. 用户还可以为所有的新列或部分新列增加一个COMMNET子句,进行写注释。这些注释并非“继承”原始表中的定义。同样地,如果ASSELECT子句中包含没有命名别名的表达式的话,例如size(cols)(计算cols中元素的个数),那么Hive将会使用_CN作为新的列名,其中N表示从0开始的一个整数。如果ASSELECT语句不合法的话,那么创建视图过程将失败。
  5. 在ASSELECT子句之前,用户可以通过定义TBLPROPERTIES来定义表属性信息,这点和表相同。
    CREATE TABLE...LIKE... 结构同样适用于复制视图,只需要在LIKE表达式里面写视图名就可以了:
    CREATE TABLE shipments2 LIKE shipments; 用户也可以像以前一样选择性使用 EXTERNAL 关键字和 LOCATION..… 子句。
  6. 警告对于Hivev0.8.0版本和这个版本前的其他版本来说,这个语句的行为是不同的。对于v0.8.0版本,这个命令会创建一个新的表,而不是一个新的视图,同时使用默认的SerDe方式和文件格式。而对于之前的早期版本来说,会创建一个新的视图。
  7. 删除视图的方式和删除表的方式类似:DROP VIEW IE EXISTS shipments;
  8. 通过 SHOW TABLES 语句(没有SHOW VIEWS这样的语句)同样可以查看到视图,但是不能使用DROP TABLE语句来删除视图。
  9. 和表一样,DESCRIBEDESCRIBE EXTENDED 语句可以显示视图的元数据信息。
    如果使用后面那个命令,输出信息中的 “Detailed Table Information” 部分会有一个 tableType 字段,字段值显示的是 “VIRTUAL_VIEW”
  10. 视图不能够作为 INSERT 语句或 LOAD 命令的目标表。
  11. 最后要说明的是,视图是只读的。对于视图只允许改变元数据中TBLPROPERTIES属性信息:
    ALTER VIEW shipments SET TBLPROPERTIES('created at'='some_timestamp');