1.视图的基本概念
- 通过隐藏子查询、连接查询等操作的(简化后的)逻辑结构
- 从数据库的真实表中选取出来的数据组成
- 是一个与真实表不同的虚拟表,只保存定义,不存储数据 它类似于一张表,对表的查询操作都可以在视图中使用。
- 在Hive中,视图是只读的,不能向视图中插入或是装载数据。
2.Hive 视图的使用场景
(1)对一些数据进行访问权限授权
对于一些真实表,不希望未授权的用户查看具有特性安全性的行或列,可以建立视图,选取可以提供的列,可以通过建立视图,选择能提供给用户的列,并授权用户查看。
比如,在retail_db数据库customers表中,"customer_password"是顾客的隐私信息,其不应该提供给用户访问,可以使用视图来限制数据访问权限以达到保护顾客信息不被随意查询的目的。
sql
#其中CREATE VIEW是创建视图的命令,将customer_password字段隐藏,只提供用户查询customer_view的权限。
CREATE VIEW customer_view AS SELECT customer_fname,customer_lname,
customer_email,customer_state,customer_city
FROM customers;
(2)对于复杂场景,可使用视图代替复杂查询语句
sql
#转换为视图形式,首先创建一个子查询视图,之后执行子查询就只需要直接查询该视图即可
CREATE VIEW customer_orders_view AS
SELECT c.customer_id,c.customer_email,c.customer_state,c.customer_city,
concat(c.customer_lastname,"",c.customer_fname) customer_name, o.order_date,o.order_staus
FROM customers c JOIN orders o ON (c.customer_id=o.order_customer_id)
WHERE c.customer_fname='Mary';
SELECT customer_name FROM customer_orders_view WHERE order_status="COMPLETE";
3.视图的优势
(1)使用视图可简化用户对数据的理解,用户可以将注意力集中在其关心的数据上,而不是全部的数据;
(2)使用视图可以过滤一些敏感数据;
(3)使用视图可以降低查询复杂度,当查询语句中存在复杂子查询,可以使用视图语句进行分隔,进而降低查询复杂度。
4.视图的基本操作命令及操作
(1)CREATE命令,创建视图
sql
#CREATE VIEW是创建视图命令,其中COMMENT和TBLPROPERTIES与创建表含义相同,AS SELECT指定查询语句
CREATE VIEW [IF EXISTS][db_name.]view_name[(column_name[COMMENT column_comment],...)]
[COMMENT view_comment]
[TBLPROPERTIES(property_name=property_value)]
AS SELECT ...;
(2)SHOW命令,查看视图
在Hive2.2.0版本之前,查看已经创建的视图只能使用SHOW TABLES命令,在2.2.0版本之后,Hive提供了SHOW #VIEWS 命令,,使用1.1.0,采用SHOW TABLES命令
sql
SHOW TABLES[IN/FROM database_name][LIKE 'pattern_with_wildcards'];
#查看视图的详细信息/查看视图定义方式/查询视图的方式
desc formatted customer_orders_view;
SHOW CREATE TABLE view_name;
select * from customer_orders_view limit 10;
(3)DROP命令,删除视图(功能有局限)
sql
DROP VIEW [IF NOT EXISTS] [db_name].view_name;
(4)ALTER命令,修改视图
sql
#其中table_properties的格式为(property_name=property_value, property_name=property_value,.......)
ALTER VIEW [db_name].view_name SET TBLPROPERTIES table_properties;
#使用AS SELECT更改视图定义
ALTER VIEW [db_name].view_name AS select_statement;
5.物化视图(Materialized Views)
(1)物化视图概述
是对数据的一个快照,在复杂的查询场景中,物化视图预先计算并保存查询结果,真正查询时可提高效率。
物化视图与普通视图的区别在于:物化视图会存储数据,具有表一样的特征;而普通视图不存储数据,是只有表结构的虚拟表。
(2)物化视图操作
CREATE,创建
sql
CREATE MATERIALIZED VIEW 物化视图名称 AS
SELECT 列1, 列2, ...
FROM 表名称
WHERE 条件;
SHOW,查看
sql
# 查看所有的Materialized Views
SELECT MATERIALIZED VIEWS [IN database_name]['identifier_with_wildcards'];
sql
# 查看指定Materialized Views的信息
DESCRIBE [EXTENDED | FORMATTED][db_name.]materialized_view_name;
DESCRIBE,查看描述
sql
# 查看物化视图 product_sales_summary 的结构。
DESCRIBE product_sales_summary;
DROP,删除
sql
# 删除物化视图,释放存储空间。
DROP MATERIALIZED VIEW product_sales_summary;
6.侧视图(Lateral View)
(1)概述
- 侧视图一般与UDTF结合使用,UDTF为每个输出行生成零个或多个输出行;
- 侧视图会将UDTF应用于基表的每一行,然后将结果输出行对应连接到输入行。
(2)操作
侧视图最常与UDTF如explode()函数结合使用
sql
#单个Lateral View
#其中"expression"可以是ARRAY,MAP等类型的字段名,也可以是使用其他函数,如split()函数,tableAlias是视#图名,必须指定,columnAlias是侧视图在新生成的数据集上的列名
LATERAL VIEW udtf(expression) tableAlias AS columnAlias (','columnAlias)*
#多个Lateral View(示例),按照Lateral View出现的顺序应用
SELECT * FROM exampleTable
LATERAL VIEW explode(col1) myTable1 AS myCol1
LATERAL VIEW explode(col2) myTable2 AS myCol2;
#Outer Lateral View,当UDTF不产生任何行时,需要使用outer关键字进行类似于左连接的拼接才能正确查询到数据
SELECT name,work_place,loc from empdb.emp
Lateral view outer explode(split(null,',')) a as loc;
7.物化视图与视图的区别
- 视图是虚拟的,逻辑存在的,只有定义没有存储数据;
- 物化视图是真实的,物理存在的,里面存储着预计算的数据;
- 视图的目的是简化降低查询的复杂度,而物化视图的目的是提高查询性能。
物化视图 能够缓存数据,在创建物化视图的时候就把数据缓存起来了,Hive把物化视图当成一张"表",将数据缓存。而视图只是创建一个虚表,只有表结构,没有数据,实际查询的时候再去改写SQL去访问实际的数据表。