【大数据hive】hive视图与物化视图使用详解

news2025/1/11 12:41:48

目录

一、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 物化视图其他常用命令


一、hive中的视图

使用过mysql视图的同学对视图的概念应该不陌生,视图就是一种虚拟表,可以临时存储查询的数据,hive中也提供了视图,hive中的视图具有下面的特点:

  • Hive中的视图(view)是一种虚拟表,只保存定义,不实际存储数据;
  • 通常从真实的物理表查询中创建生成视图,也可以从已经存在的视图上创建新视图;
  • 创建视图时,将冻结视图的架构,如果删除或更改基础表,则视图将失败;

视图是用来简化操作的,不缓冲记录,也没有提高查询性能

二、hive视图语法与操作

2.1 数据准备

在test数据库下有下面的几张表

 使用t_usa_covid19这张表,并且插入部分数据

2.2  创建视图

2.2.1 创建普通的视图

create view v_usa_covid19 as select count_date, county,state,deaths from t_usa_covid19 limit 10;

创建成功后,可以使用 : show views 查看视图; 

2.2.2 基于视图创建视图

以上面创建的视图的基础上再次创建一个视图

create view v_usa_covid19_from_view as select * from v_usa_covid19 limit 5;

2.3 查看视图定义

show create table 视图名称;

2.4  使用视图

当视图创建出来之后就可以基于视图查询数据了,比如使用第一个视图查询数据

select * from v_usa_covid19;

就可以正常返回数据了; 

 注意

视图是虚拟的,只能用于查询相关操作,不能向视图中插入数据

2.5  删除视图

drop 视图名

2.6 更改视图属性

给视图增加一个备注名称

alter view v_usa_covid19 set TBLPROPERTIES ('comment' = 'This is my view');

2.7 更改视图定义

只查询指定的某些字段

alter view v_usa_covid19 as  select county,deaths from t_usa_covid19 limit 5;

三、使用视图的好处

3.1 只将真实表中特定的列数据提供给用户,保护数据隐式

下面这个例子使用视图来限制数据访问可以用来保护信息不被随意查询

3.1.1 创建一个表

create table userinfo(firstname string, lastname string, ssn string, password string);

3.1.2 基于这个表创建一个视图

该视图只返回部分字段,比如密码比较隐私就不返回;

create view safer_user_info as select firstname, lastname from userinfo;

3.2  降低查询的复杂度,优化查询语句

如下为一个嵌套子查询语句

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;

四、hive物化视图

4.1 hive 物化视图概念

物化视图(Materialized View)是一个包括查询结果的数据库对像,可以用于预先计算并保存表连接或聚集等耗时较多的操作的结果。在执行查询时,就可以避免进行这些耗时的操作,而从快速的得到结果。

使用物化视图的目的就是通过预计算,提高查询性能,当然需要占用一定的存储空间。

4.1.1 hive物化视图特点

  • Hive3.0开始尝试引入物化视图,并提供对于物化视图的查询自动重写机制(基于Apache Calcite实现);
  • Hive的物化视图还提供了物化视图存储选择机制,可以本地存储在Hive,也可以通过用户自定义storage handlers存储在其他系统(如Druid);
  • Hive引入物化视图的目的就是为了优化数据查询访问的效率,相当于从数据预处理的角度优化数据访问;
  • Hive从3.0丢弃了index索引的语法支持,推荐使用物化视图和列式存储文件格式来加快查询的速度;

4.2 物化视图与视图的区别

  • 视图是虚拟的,逻辑存在的,只有定义没有存储数据;
  • 物化视图是真实的,物理存在的,里面存储着预计算的数据;
  • 视图的目的是简化降低查询的复杂度,而物化视图的目的是提高查询性能;

物化视图能够缓存数据,在创建物化视图的时候就把数据缓存起来了,Hive把物化视图当成一张“表”,将数据缓存。而视图只是创建一个虚表,只有表结构,没有数据,实际查询的时候再去改写SQL去访问实际的数据表;

4.3 物化视图语法

完整语法树如下


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 ...;

补充说明:

  • 物化视图创建后,select查询执行数据自动落地,“自动”也即在query的执行期间,任何用户对该物化视图是不可见的,执行完毕之后物化视图可用;
  • 默认情况下,创建好的物化视图可被用于查询优化器optimizer查询重写,在物化视图创建期间可以通过DISABLE REWRITE参数设置禁止使用;
  • 默认SerDe和storage format为hive.materializedview.serde、 hive.materializedview.fileformat;

物化视图支持将数据存储在外部系统(如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;

4.4 基于物化视图的查询重写

从上面的内容我们知道,物化视图创建后即可用于相关查询的加速,即:用户提交查询query,若该query经过重写后可以命中已经存在的物化视图,则直接通过物化视图查询数据返回结果,以实现查询加速。

是否重写查询使用物化视图可以通过全局参数控制,默认为true,如下设置;

hive.materializedview.rewriting=true

用户可选择性的控制指定的物化视图查询重写机制,语法如下:

ALTER MATERIALIZED VIEW [db_name.]materialized_view_name ENABLE|DISABLE REWRITE;

物化视图的查询重写过程

  • 用户提交查询query
  • 若该query经过重写后可以命中已经存在的物化视图
  • 则直接通过物化视图查询数据返回结果,以实现查询加速

4.5 操作演示

前置操作,当前会话窗口执行下面的设置

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实例上运行多少个压缩程序工作线程。

4.5.1 新建一张事务表 student_trans

CREATE TABLE student_trans (
      sno int,
      sname string,
      sdept string)
clustered by (sno) into 2 buckets stored as orc TBLPROPERTIES('transactional'='true');

4.5.2 导入数据到student_trans中

insert overwrite table student_trans select num,name,dept from student;

执行完成后检查表的数据

4.5.3 基于student_trans建立聚合物化视图

CREATE MATERIALIZED VIEW student_trans_agg AS SELECT sdept, count(*) as sdept_cnt from student_trans group by sdept;

从执行过程也可以看出,这里当执行CREATE MATERIALIZED VIEW,会启动一个MR对物化视图进行构建,执行完成后可以发现当下的数据库中有了一个物化视图;

4.5.4 聚合查询原始表与查询物化视图对比

先删除上面的物化视图

对原始表student_trans查询

重新创建物化视图后再次查询

对比两者的查询过程不难看出,第一个查询执行了map-reduce任务,耗时2秒多,第二个查询,没有执行map-reduce任务,由于会命中物化视图,重写query查询物化视图,查询速度会加快(没有启动MR,只是普通的table scan),查询时间提升了一倍多,这要是在数据量非常大的情况下性能将是巨大的改善;

为了进一步验证上面的说法,可以使用explain进行执行计划的查看

检查hdfs文件目录,可以发现也创建了一个物化视图表的数据目录 

4.5.5 物化视图其他常用命令

#验证禁用物化视图自动重写
ALTER MATERIALIZED VIEW student_trans_agg DISABLE REWRITE;

#查看物化视图
show materialized views;

#删除物化视图
drop materialized view student_trans_agg;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/580526.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

线程同步模式的设计思路

👳我亲爱的各位大佬们好😘😘😘 ♨️本篇文章记录的为 JDK8 新特性 Stream API 进阶 相关内容,适合在学Java的小白,帮助新手快速上手,也适合复习中,面试中的大佬🙉🙉🙉。 …

ISCC2023 擂台misc wp

刚想起来发 文章目录 雪豹哦?摩斯密码?ඞG9的钢琴曲BNG听你心跳里的狂Brain Games user-id:芝士雪豹 雪豹 这道题没啥意思,存粹为了套拿450分。知识点属于重复知识点,见谅: 拿到附件,用360解…

分布式网络通信框架(十)——Mprpc框架使用示例

发布一个服务提供远程调用方法的流程 若想要发布一个服务提供一些远程调用方法,步骤如下: 先在protobuf文件中添加参数和返回值的message 类型,然后再添加希望提供的服务 service 类型(如UserServiceRpc)和 其中的方…

傅里叶级数和傅里叶变换之间的关系推理及应用

傅里叶级数和傅立叶变换是傅里叶分析的两个主要工具,它们之间有密切的关系。 什么是傅里叶级数 傅里叶级数是将一个周期函数分解为一系列正弦和余弦函数的和。它适用于周期性信号,可以将周期函数表示为一组振幅和相位不同的谐波分量的和。傅里叶级数展…

【ChatGPT】ChatGPT快速生成短视频

1.chatGPT剪映 chatGPT生成文本后通过剪映图文成片 这次用了new bing:Chatbot AI 在线网页版 (atmob.cn) 打开剪映-图文成片 把new bing生成的文本粘贴过来,点击生成视频。 生成好了,是这样 剪映自动生成的,最后还是得手工改改&…

ChatGPT生成Excel统计公式

🍏🍐🍊🍑🍒🍓🫐🥑🍋🍉 ChatGPT生成Excel统计公式 文章目录 🍐问题引入🍐具体操作🐳结语 🍐问题引入…

如何使用 service account 获取 keycloak 的用户信息

Keycloak 是一个开源的权限管理和认证系统。使用 Keycloak 可以让开发者专注于解决业务的核心问题。获取用户信息是权限管理和认证系统需要的基本功能。Service Account 是OAuth 2.0推荐的系统服务使用的账户,开发者可以通过 Keycloak 的 Service Account 来让自己的…

【嵌入式烧录/刷写文件】-3.2-S19/Hex文件转换为Bin文件

案例背景(共6页精讲): 该篇将告诉您:如何使用Vector HexView工具,对一个Intel Hex或Motorola S-record(S19/SREC/mot/SX)文件转换为bin文件。 目录 1 Intel Hex,Motorola S-record(S19/SREC/mot/SX),Bin文件之间的差…

基于SpringBoot养老院管理系统

目录 一、项目介绍 二. 运行环境 三、项目技术 四、部署项目 五、项目运行 六、项目展示 五、项目下载 一、项目介绍 基于springboot的养老院管理系统拥有多种角色账号:管理员和用户 管理员:管理员管理、用户管理、健康管理、病例方案管理、药品…

计算机网络面试八股文

网络分层结构 计算机网络体系大致分为三种,OSI七层模型、TCP/IP四层模型和五层模型。一般面试的时候考察比较多的是五层模型。最全面的Java面试网站:最全面的Java面试网站 五层模型:应用层、传输层、网络层、数据链路层、物理层。 应用层&a…

文生视频综述

文字生成视频当前挑战 和发展现状_哔哩哔哩_bilibili今天我们聊了什么是 text to video,它的原理和目前的研究进展。text to video 是一种将文本转换为视频的技术,它可以通过图像处理、语音识别和自然语言处理等技术来实现。目前,text to vid…

【C语言】刷题训练营 —— 每日一练(十三)

文章目录 前言 BC123 小乐乐找最大数BC124 小乐乐是否被叫家长BC125 小乐乐转换成绩BC126 小乐乐算多少人被请家长BC127 小乐乐算最高分BC128 小乐乐计算求和BC129 小乐乐计算函数BC130 小乐乐查找数字BC131 KiKi学程序设计基础BC132 KiKi算期末成绩完结 前言 大家好&#xff…

计算机体系结构标量处理机

先行控制技术 缓冲深度的设计方法 以先行指令缓冲栈为例。 假设缓冲深度为 D 1 D_1 D1​,考虑以下两种极端情况。 (1)先行指令缓冲栈已经充满,此时指令流出速度最快,例如连续分析RR型指令 ,设这种指令序…

[元带你学: eMMC协议详解 12] Speed Mode 选择

依JEDEC eMMC 5.1及经验辛苦整理,付费内容,禁止转载。 所在专栏 《元带你学: eMMC协议详解》 内容摘要 全文 2000字, 介绍了各种Speed Mode 选择的方法, 需要按照一定的步骤, 重点需要掌握HS400, High Speed 和 HS20…

python中的流程控制语句

文章目录 if-else语句代码演示: if-elif-else语句代码演示1:代码演示2: while 循环语句循环语句练习1.求100以内所有的奇数之和2.求100以内所有7的倍数之和,以及个数3.求1000内的水仙花数4.获取用户输入的任意数,判断是…

《Reinforcement Learning: An Introduction》第2章笔记

2. Multi-armed Bandits 评估性反馈(evaluative feedback) 完全取决于采取的动作,这是强化学习采用的方式。纯粹的评估性反馈表明要执行的动作有多好,但是不关注它是否是可能的最好或最坏的动作。指导性反馈(instruct…

迭代器Iterator和生成器funcion *

迭代器Iterator 迭代器 为各种不同的数据结果提供统一的访问机制,任何数据结构只要部署Iterator接口,就可以完成便利操作,主要提供for of 工作原理: 创建一个指针对象,指向当前数组的起始位置 第一次调用对象的next方…

JAVA之数组2

添加元素 从后往前进行迭代,最后在末尾插入元素 tip:为避免数字在覆盖过程中丢失,故从后往前覆盖 删除元素 从前往后迭代,最后将末尾赋值为0 tip: 以覆盖的数arr【i】为基准,构造循环 共同处Tip: 范围均为【index1&…

子串--子字符串 0528

210102 201012 A1A2…An An…A2A1 如何做, 翻转的是21,因为2>1; 翻转的是210,因为2>0; 翻转的是2101,因为2>1; 翻转的是21010,因为2>0; 翻转的是210102,因为22且1&…

JavaScript 进阶 (二)

目录 深入对象 创建对象三种方式 构造函数 实例成员&静态成员 内置构造函数 Object Array String Number 深入对象 创建对象三种方式 1. 利用对象字面量创建对象 const obj { name : abc} 2. 利用 new Object 创建对象 const obj new Object({ uname: 123 }…