【Hive】07-HiveQL:视图

2023-11-28 23:48
文章标签 视图 hive 07 hiveql

本文主要是介绍【Hive】07-HiveQL:视图,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

视图可以允许保存一个查询并像对待表一样对这个查询进行操作。这是一个逻辑结构,因为它不像一个表会存储数据。换句话说,Hive目前暂不支持物化视图。
当一个查询引用一个视图时,这个视图所定义的查询语句将和用户的查询语句组合在一起,然后供Hive制定查询计划。从逻辑上讲,可以想象为Hive先执行这个视图,然后使用这个结果进行余下后续的查询。

1、使用视图来降低查询复杂度

当查询变得长或复杂的时候,通过使用视图将这个查询语句分割成多个小的、更可控的片段可以降低这种复杂度。这点和在编程语言中使用函数或者软件设计中的分层设计的概念是一致的。封装复杂的部分可以是最终用户通过重用重复的部分来构建复杂的查询。例如,如下是一个具有嵌套子查询的查询:

FROM (
SELECT * FROM people JOIN cart
ON(cart.people_id=people.id)WHERE firstname='john'
) a SELECT a.lastname WHERE a.id=3;

Hive查询语句中含有多层嵌套是非常常见的。在下面这个例子中,嵌套子查询变成了一个视图:

CREATE VIEW shorter_join AS
SELECT FROM people JOIN cart
ON(cart.people_id=people.id) WHERE firstname='john'

现在就可以像操作表一样来操作这个视图了。本次的查询语句中我们为SELECT语句增加了一个WHERE子句,这样就大大简化了之前的那个查询语句:

SELECT lastname FROM shorter_join WHERE id=3

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

对于视图来说一个常见的使用场景就是基于一个或多个列的值来限制输出结果。有些数据库允许将视图作为一个安全机制,也就是不给用户直接访问具有敏感数据的原始表,而是提供给用户一个通过WHERE子句限制了的视图,以供访问。Hive目前并不支持这个功能,因为用户必须具有能够访问整个底层原始表的权限,这时视图才能工作。然而,通过创建视图来限制数据访问可以用来保护信息不被随意查询:

如下是通过WHERE子句限制数据访问的视图的另一个例子。在这种情况下,我们希望提供一个员工表视图,只暴露来自特定部门的员工信息:

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

我们介绍过Hive支持array、map和struct数据类型。这些数据类型在传统数据库中并不常见,因为它们破坏了第一范式。Hive可将一行文本作为一个map而非一组固定的列的能力,加上视图功能,就允许用户可以基于同一个物理表构建多个逻辑表。

思考下面这个示例文件。其将整行作为一个map处理,而不是一列固定的列。这里没有使用Hive的默认分隔符,这个文件使用AA(Control+A)作为集合内元素间的分隔符(例如,本例中map的多个键.值对之间的分隔符),然后使用^B(Control+B)作为map中的键和值之间的分隔符。因为这条记录较长,所以为了更清晰地表达,我们人为地增加了空行:

下面我们来创建表:

上面的例子中,因为每行只有一个字段,因此FIELDSTERMINATEDBY语句所指定的分隔符实际上没有任何影响。
现在我们可以创建这样一个视图,其仅取出呼值等于request的city、state和part 3个字段,并将视图命名为orderso视图orders具有3个字段:state、city和part。

我们创建的第2个视图名为shipmentse这个视图返回time和part2个字段作为列,限制条件是的值为response:

4、视图零零碎碎相关的事情

我们说过,Hive会先解析视图,然后使用解析结果再来解析整个查询语句。然而,作为Hive查询优化器的一部分,查询语句和视图语句可能会合并成一个单一的实际查询语句。
然而,这个概念视图仍然适用于视图和使用这个视图的查询语句都包含了一个ORDER BY子句或一个LIMIT子句的情况。这时会在使用这个视图的查询语句之前对该视图进行解析。
例如,如果视图语句含有一个LIMIT100子句,而同时使用到这个视图的查询含有一个LIMIT 200子句,那么用户最终最多只能获取1佣条结果记录。
因为定义一个视图实际上并不会“具体化”操作任何实际数据,所以视图实际上是对其所使用到的表和列的一个查询语句固化过程。因此,如果视图所涉及的表或者列不再存在时,会导致视图查询失败。创建视图时用户还可以使用其他一些子句。如下例子修改了我们前面那个例子:

对于表来说, IF NOT ExISTS 和 COMMENT … 子句是可选的,而且和表创建语句具有相同的含义。一个视图的名称要和这个视图所在的数据库下的其他所有表和视图的名称不同。用户还可以为所有的新列或部分新列增加一个 COMMNET 子句,进行写注释.这些注释并非“继承”原始表中的定义。同样地,如果 AS SELECT 子句中包含没有命名别名的表达式的话,例如 si 州 colsX 计算 cols 中元素的个数),那么 Hive 将会使用一 N 作为新的列名,其中 N 表示从 0 开始的一个整数。如果 AS SELECT 语句不合法的话,那么创建视图过程将失败。在 AS SELECT 子句之前,用户可以通过定义 TBLPROPERTIES 来定义表属性信息,这点和表相同。上例中,我们定义的属性为"creator" ,表示这个视图的创建者名称。复制视图,只需要在 LIKE 表达式里面写视图名就可以了:

用户也可以像以前一样选择性使用 EXTERNAL 关键字和 LOCATION … 子句。

删除视图的方式和删除表的方式类似:

DROP VIEW IF EXISTS shipments 

;和往常一样,上面例子中的 IF ExiSTS 语句是可选的。通过 SHOW TABLES 语句(没有 SHOW VIEWS 这样的语句)同样可以查看到视图,但是不能使用 DROP TABLE 语句来删除视图。和表一样, DESCRIBE 和DESCRIBE EXTENDED 语句可以显示视图的元数据信息。如果使用后面那个命令.输出信息中的“ Detailed Table Information ”部分会有一个 tableType字段,字段值显示的是“ VIRTUAL_VIEW ’。视图不能够作为 INSERT 语句或 LOAD 命令的目标表。最后要说明的是,视图是只读的。对于视图只允许改变元数据中 TBLPROPERTIES 属性信息:

ALTER VIEW shipments SET TBLPROPERTIES  ("created_at"="some_timestamp');

 

这篇关于【Hive】07-HiveQL:视图的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/430666

相关文章

数据视图(AngularJS)

<!DOCTYPE html><html ng-app="home.controller"><head><meta charset="utf-8"><title>数据视图</title><link href="page/common/css/bootstrap.min.css" rel="stylesheet"><script src="page/common/js/angular.js"></

07 v-if和v-show使用和区别

划重点: v-ifv-show 小葱拌豆腐 <!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta http-equiv="X-UA-Compatible" content="

12C 新特性,MOVE DATAFILE 在线移动 包括system, 附带改名 NID ,cdb_data_files视图坏了

ALTER DATABASE MOVE DATAFILE  可以改名 可以move file,全部一个命令。 resue 可以重用,keep好像不生效!!! system照移动不误-------- SQL> select file_name, status, online_status from dba_data_files where tablespace_name='SYSTEM'

Hive和Hbase的区别

Hive 和 HBase 都是 Hadoop 生态系统中的重要组件,它们都能处理大规模数据,但各自有不同的适用场景和设计理念。以下是两者的主要区别: 1. 数据模型 Hive:Hive 类似于传统的关系型数据库 (RDBMS),以表格形式存储数据。它使用 SQL-like 语言 HiveQL 来查询和处理数据,数据通常是结构化或半结构化的。HBase:HBase 是一个 NoSQL 数据库,基

架构全景视图

文章目录 一、战略规划二、业务架构Business Architecture2.1业务架构定义2.2 业务架构组成2.3 TOGAF2.3.1 Archimate建模(重要) 三、数据架构Data Architecture3.1 数据架构定义3.2 数据架构组成 四、应用架构Application Architecture4.1 应用架构定义4.2 应用架构组成 五、技术架构Technol

2409wtl,切换视图

原文 介绍 我从一个基于SDI(单文档接口)WTL向导的应用开始,添加了一些从控件继承的窗口和一些对话框窗口(表单视图),然后才发现我必须,使SDI框架动态加载和卸载子窗口. 本文演示了两个可用来完成的技术:在SDI应用中的视图间动态切换.这是我使用的两个. 技术 1技术:第一个方法涉及按需析构和重建视图实例.这更简单,且在不介意析构和重建窗口对象时效果很好. 2:按需创建视图,然后用

掌握Hive函数[2]:从基础到高级应用

目录 高级聚合函数 多进一出 1. 普通聚合 count/sum... 2. collect_list 收集并形成list集合,结果不去重 3. collect_set 收集并形成set集合,结果去重  案例演示 1. 每个月的入职人数以及姓名  炸裂函数  概述  案例演示 1. 数据准备 1)表结构 2)建表语句 3)装载语句 2. 需求 1)需求说明 2)答

java基础总结07-面向对象3(this关键字)

this是一个引用,它指向自身的这个对象。 看内存分析图 假设我们在堆内存new了一个对象,在这个对象里面你想象着他有一个引用this,this指向这个对象自己,所以这就是this,这个new出来的对象名字是什么,我们不知道,不知道也没关系,因为这并不影响这个对象在内存里面的存在,这个对象只要在内存中存在,他就一定有一个引用this。 看下面的例子分析: package cn.ga

【SpringMVC学习07】SpringMVC与前台的json数据交互

json数据格式在接口调用中、html页面中比较常用,json格式比较简单,解析也比较方便,所以使用很普遍。在springmvc中,也支持对json数据的解析和转换,这篇文章主要总结一下springmvc中如何和前台交互json数据。 1. 两种交互形式  springmvc和前台交互主要有两种形式,如下图所示: 可以看出,前台传过来的方式有两种,一种是传json格式的数据过来,另一种

周末总结(2024/09/07)

工作 人际关系核心实践: `要学会随时回应别人的善意,执行时间控制在5分钟以内 坚持每天早会打招呼 遇到接不住的话题时拉低自己,抬高别人(无阴阳气息) 朋友圈点赞控制在5min以内,职场社交不要放在5min以外 职场的人际关系在面对利益冲突是直接质疑,要快准狠,不要内耗、 回复消息要控制在30mins之内,一定要及时回复`` 工作上的要点 现状(已经提了离职,last day在9月20号)