目录
一、hive中的视图
二、hive视图语法与操作
2.1 数据准备
2.2 创建视图
2.2.1 创建普通的视图
2.2.2 基于视图创建视图
2.3 查看视图定义
2.4 使用视图
2.5 删除视图
2.6 更改视图属性
2.7 更改视图定义
三、使用视图的好处
3.1 只将真实表中特定的列数据提供给用户,保护数据隐式
3.1.1 创建一个表
3.1.2 基于这个表创建一个视图
3.2 降低查询的复杂度,优化查询语句
四、hive物化视图
4.1 hive 物化视图概念
4.1.1 hive物化视图特点
4.2 物化视图与视图的区别
4.3 物化视图语法
4.4 基于物化视图的查询重写
4.5 操作演示
4.5.1 新建一张事务表 student_trans
4.5.2 导入数据到student_trans中
4.5.3 基于student_trans建立聚合物化视图
4.5.4 聚合查询原始表与查询物化视图对比
4.5.5 物化视图其他常用命令
使用过mysql视图的同学对视图的概念应该不陌生,视图就是一种虚拟表,可以临时存储查询的数据,hive中也提供了视图,hive中的视图具有下面的特点:
视图是用来简化操作的,不缓冲记录,也没有提高查询性能
在test数据库下有下面的几张表
使用t_usa_covid19这张表,并且插入部分数据
create view v_usa_covid19 as select count_date, county,state,deaths from t_usa_covid19 limit 10;
创建成功后,可以使用 : show views 查看视图;
以上面创建的视图的基础上再次创建一个视图
create view v_usa_covid19_from_view as select * from v_usa_covid19 limit 5;
show create table 视图名称;
当视图创建出来之后就可以基于视图查询数据了,比如使用第一个视图查询数据
select * from v_usa_covid19;
就可以正常返回数据了;
注意
视图是虚拟的,只能用于查询相关操作,不能向视图中插入数据
drop 视图名
给视图增加一个备注名称
alter view v_usa_covid19 set TBLPROPERTIES ('comment' = 'This is my view');
只查询指定的某些字段
alter view v_usa_covid19 as select county,deaths from t_usa_covid19 limit 5;
下面这个例子使用视图来限制数据访问可以用来保护信息不被随意查询
create table userinfo(firstname string, lastname string, ssn string, password string);
该视图只返回部分字段,比如密码比较隐私就不返回;
create view safer_user_info as select firstname, lastname from userinfo;
如下为一个嵌套子查询语句
from (
select * from people join cart
on(cart.pepople_id = people.id) where firstname = 'join' ) a select a.lastname where a.id = 3;
利用视图,可以将内部的关联查询封装为一个视图
create view shorter_join as select * from people join cart n (cart.pepople_id = people.id) where firstname = 'join';
有了视图之后,就可以基于视图简化查询语句了
select lastname from shorter_join where id = 3;
物化视图(Materialized View)是一个包括查询结果的数据库对像,可以用于预先计算并保存表连接或聚集等耗时较多的操作的结果。在执行查询时,就可以避免进行这些耗时的操作,而从快速的得到结果。
使用物化视图的目的就是通过预计算,提高查询性能,当然需要占用一定的存储空间。
物化视图能够缓存数据,在创建物化视图的时候就把数据缓存起来了,Hive把物化视图当成一张“表”,将数据缓存。而视图只是创建一个虚表,只有表结构,没有数据,实际查询的时候再去改写SQL去访问实际的数据表;
完整语法树如下
CREATE MATERIALIZED VIEW [IF NOT EXISTS] [db_name.]materialized_view_name
[DISABLE REWRITE]
[COMMENT materialized_view_comment]
[PARTITIONED ON (col_name, ...)]
[CLUSTERED ON (col_name, ...) | DISTRIBUTED ON (col_name, ...) SORTED ON (col_name, ...)]
[
[ROW FORMAT row_format]
[STORED AS file_format]|
STORED BY 'storage.handler.class.name' [WITH SERDEPROPERTIES (...)]
]
[LOCATION hdfs_path]
[TBLPROPERTIES (property_name=property_value, ...)]
AS SELECT ...;
补充说明:
物化视图支持将数据存储在外部系统(如druid),如下述语法所示:
CREATE MATERIALIZED VIEW druid_wiki_mv
STORED AS 'org.apache.hadoop.hive.druid.DruidStorageHandler'
AS
SELECT __time, page, user, c_added, c_removed
FROM src;
目前支持物化视图的操作有drop和show操作,后续会增加其他操作
DROP MATERIALIZED VIEW [db_name.]materialized_view_name;
DESCRIBE [EXTENDED | FORMATTED] [db_name.]materialized_view_name;
当数据源变更(新数据插入inserted、数据修改modified),物化视图也需要更新以保持数据一致性,目前需要用户主动触发rebuild重构;
ALTER MATERIALIZED VIEW [db_name.]materialized_view_name REBUILD;
从上面的内容我们知道,物化视图创建后即可用于相关查询的加速,即:用户提交查询query,若该query经过重写后可以命中已经存在的物化视图,则直接通过物化视图查询数据返回结果,以实现查询加速。
是否重写查询使用物化视图可以通过全局参数控制,默认为true,如下设置;
hive.materializedview.rewriting=true
用户可选择性的控制指定的物化视图查询重写机制,语法如下:
ALTER MATERIALIZED VIEW [db_name.]materialized_view_name ENABLE|DISABLE REWRITE;
物化视图的查询重写过程
前置操作,当前会话窗口执行下面的设置
set hive.support.concurrency = true; --Hive是否支持并发
set hive.enforce.bucketing = true; --从Hive2.0开始不再需要 是否开启分桶功能
set hive.exec.dynamic.partition.mode = nonstrict; --动态分区模式 非严格
set hive.txn.manager = org.apache.hadoop.hive.ql.lockmgr.DbTxnManager; --
set hive.compactor.initiator.on = true; --是否在Metastore实例上运行启动线程和清理线程
set hive.compactor.worker.threads = 1; --在此metastore实例上运行多少个压缩程序工作线程。
CREATE TABLE student_trans (
sno int,
sname string,
sdept string)
clustered by (sno) into 2 buckets stored as orc TBLPROPERTIES('transactional'='true');
insert overwrite table student_trans select num,name,dept from student;
执行完成后检查表的数据
CREATE MATERIALIZED VIEW student_trans_agg AS SELECT sdept, count(*) as sdept_cnt from student_trans group by sdept;
从执行过程也可以看出,这里当执行CREATE MATERIALIZED VIEW,会启动一个MR对物化视图进行构建,执行完成后可以发现当下的数据库中有了一个物化视图;
先删除上面的物化视图
对原始表student_trans查询
重新创建物化视图后再次查询
对比两者的查询过程不难看出,第一个查询执行了map-reduce任务,耗时2秒多,第二个查询,没有执行map-reduce任务,由于会命中物化视图,重写query查询物化视图,查询速度会加快(没有启动MR,只是普通的table scan),查询时间提升了一倍多,这要是在数据量非常大的情况下性能将是巨大的改善;
为了进一步验证上面的说法,可以使用explain进行执行计划的查看
检查hdfs文件目录,可以发现也创建了一个物化视图表的数据目录
#验证禁用物化视图自动重写
ALTER MATERIALIZED VIEW student_trans_agg DISABLE REWRITE;
#查看物化视图
show materialized views;
#删除物化视图
drop materialized view student_trans_agg;