首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Hive 视图和索引

Hive 视图和索引

作者头像
每天进步一点点
发布于 2022-12-15 08:00:29
发布于 2022-12-15 08:00:29
1.5K00
代码可运行
举报
文章被收录于专栏:IfDataBigIfDataBig
运行总次数:0
代码可运行

一、视图

1.1 简介

Hive 中的视图和 RDBMS 中视图的概念一致,都是一组数据的逻辑表示,本质上就是一条 SELECT 语句的结果集。视图是纯粹的逻辑对象,没有关联的存储 (Hive 3.0.0 引入的物化视图除外),当查询引用视图时,Hive 可以将视图的定义与查询结合起来,例如将查询中的过滤器推送到视图中。

1.2 创建视图

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
CREATE VIEW [IF NOT EXISTS] [db_name.]view_name   -- 视图名称
  [(column_name [COMMENT column_comment], ...) ]    --列名
  [COMMENT view_comment]  --视图注释
  [TBLPROPERTIES (property_name = property_value, ...)]  --额外信息
  AS SELECT ...;

在 Hive 中可以使用 CREATE VIEW 创建视图,如果已存在具有相同名称的表或视图,则会抛出异常,建议使用 IF NOT EXISTS 预做判断。在使用视图时候需要注意以下事项:

  • 视图是只读的,不能用作 LOAD / INSERT / ALTER 的目标;
  • 在创建视图时候视图就已经固定,对基表的后续更改(如添加列)将不会反映在视图;
  • 删除基表并不会删除视图,需要手动删除视图;
  • 视图可能包含 ORDER BY 和 LIMIT 子句。如果引用视图的查询语句也包含这类子句,其执行优先级低于视图对应字句。例如,视图 custom_view 指定 LIMIT 5,查询语句为 select * from custom_view LIMIT 10,此时结果最多返回 5 行。
  • 创建视图时,如果未提供列名,则将从 SELECT 语句中自动派生列名;
  • 创建视图时,如果 SELECT 语句中包含其他表达式,例如 x + y,则列名称将以_C0,_C1 等形式生成; CREATE VIEW IF NOT EXISTS custom_view AS SELECT empno, empno+deptno , 1+2 FROM emp;

1.3 查看视图

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
-- 查看所有视图:没有单独查看视图列表的语句,只能使用 show tables
show tables;
-- 查看某个视图
desc view_name;
-- 查看某个视图详细信息
desc formatted view_name;

1.4 删除视图

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
DROP VIEW [IF EXISTS] [db_name.]view_name;

删除视图时,如果被删除的视图被其他视图所引用,这时候程序不会发出警告,但是引用该视图其他视图已经失效,需要进行重建或者删除。

1.5 修改视图

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
ALTER VIEW [db_name.]view_name AS select_statement;

被更改的视图必须存在,且视图不能具有分区,如果视图具有分区,则修改失败。

1.6 修改视图属性

语法:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
ALTER VIEW [db_name.]view_name SET TBLPROPERTIES table_properties;
 
table_properties:
  : (property_name = property_value, property_name = property_value, ...)

示例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
ALTER VIEW custom_view SET TBLPROPERTIES ('create'='heibaiying','date'='2019-05-05');

二、索引

2.1 简介

Hive 在 0.7.0 引入了索引的功能,索引的设计目标是提高表某些列的查询速度。如果没有索引,带有谓词的查询(如'WHERE table1.column = 10')会加载整个表或分区并处理所有行。但是如果 column 存在索引,则只需要加载和处理文件的一部分。

2.2 索引原理

在指定列上建立索引,会产生一张索引表(表结构如下),里面的字段包括:索引列的值、该值对应的 HDFS 文件路径、该值在文件中的偏移量。在查询涉及到索引字段时,首先到索引表查找索引列值对应的 HDFS 文件路径及偏移量,这样就避免了全表扫描。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
+--------------+----------------+----------+--+
|   col_name   |   data_type    | comment     |
+--------------+----------------+----------+--+
| empno        | int            |  建立索引的列  |   
| _bucketname  | string         |  HDFS 文件路径  |
| _offsets     | array<bigint>  |  偏移量       |
+--------------+----------------+----------+--+

2.3 创建索引

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
CREATE INDEX index_name     --索引名称
  ON TABLE base_table_name (col_name, ...)  --建立索引的列
  AS index_type    --索引类型
  [WITH DEFERRED REBUILD]    --重建索引
  [IDXPROPERTIES (property_name=property_value, ...)]  --索引额外属性
  [IN TABLE index_table_name]    --索引表的名字
  [
     [ ROW FORMAT ...] STORED AS ...  
     | STORED BY ...
  ]   --索引表行分隔符 、 存储格式
  [LOCATION hdfs_path]  --索引表存储位置
  [TBLPROPERTIES (...)]   --索引表表属性
  [COMMENT "index comment"];  --索引注释

2.4 查看索引

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
--显示表上所有列的索引
SHOW FORMATTED INDEX ON table_name;

2.4 删除索引

删除索引会删除对应的索引表。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
DROP INDEX [IF EXISTS] index_name ON table_name;

如果存在索引的表被删除了,其对应的索引和索引表都会被删除。如果被索引表的某个分区被删除了,那么分区对应的分区索引也会被删除。

2.5 重建索引

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
ALTER INDEX index_name ON table_name [PARTITION partition_spec] REBUILD;

重建索引。如果指定了 PARTITION,则仅重建该分区的索引。

三、索引案例

3.1 创建索引

在 emp 表上针对 empno 字段创建名为 emp_index,索引数据存储emp_index_table 索引表中

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
create index emp_index on table emp(empno) as  
'org.apache.hadoop.hive.ql.index.compact.CompactIndexHandler' 
with deferred rebuild 
in table emp_index_table ;

此时索引表中是没有数据的,需要重建索引才会有索引的数据。

3.2 重建索引

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
alter index emp_index on emp rebuild;

Hive 会启动 MapReduce 作业去建立索引,建立好后查看索引表数据如下。三个表字段分别代表:索引列的值、该值对应的 HDFS 文件路径、该值在文件中的偏移量。

3.3 自动使用索引

默认情况下,虽然建立了索引,但是 Hive 在查询时候是不会自动去使用索引的,需要开启相关配置。开启配置后,涉及到索引列的查询就会使用索引功能去优化查询。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
SET hive.input.format=org.apache.hadoop.hive.ql.io.HiveInputFormat;
SET hive.optimize.index.filter=true;
SET hive.optimize.index.filter.compact.minsize=0;

3.4 查看索引

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
SHOW INDEX ON emp;

四、索引的缺陷

索引表最主要的一个缺陷在于:索引表无法自动 rebuild,这也就意味着如果表中有数据新增或删除,则必须手动 rebuild,重新执行 MapReduce 作业,生成索引表数据。

同时按照官方文档 的说明,Hive 会从 3.0 开始移除索引功能,主要基于以下两个原因:

  • 具有自动重写的物化视图 (Materialized View) 可以产生与索引相似的效果(Hive 2.3.0 增加了对物化视图的支持,在 3.0 之后正式引入)。
  • 使用列式存储文件格式(Parquet,ORC)进行存储时,这些格式支持选择性扫描,可以跳过不需要的文件或块。

ORC 内置的索引功能可以参阅这篇文章:Hive 性能优化之 ORC 索引–Row Group Index vs Bloom Filter Index

参考资料

  1. Create/Drop/Alter View
  2. Materialized views
  3. Hive 索引
  4. Overview of Hive Indexes
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-08-25,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 IfDataBig 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
一文教你学会Hive视图和索引
我们在写HQL有没有遇到过数据量特别大的时候比如,使用HQL 处理起来非常复杂,非常慢,这时候我们可以使用Hive给加个索引来提高我们的速度。多了就不说了,我们直接开始。
大数据老哥
2021/02/04
1.2K0
一文教你学会Hive视图和索引
【Hive】DDL 与 DML 操作
删除数据库的模型行为是 RESTRICT,如果数据库不为空,需要添加 CASCADE 进行级联删除。
阿泽 Crz
2020/07/20
1.8K0
Hive SQL 语法大全,宇宙最强整理,建议收藏
LOCATION 是指定外部表的存储路径,MANAGEDLOCATION 是指定管理表的存储路径(hive 4.0.0 才支持),官方建议默认就行,让所有的表都在一个根目录下。
kk大数据
2020/11/03
7.6K0
hive索引
在关系数据库中,索引是一种单独的、物理的对数据库表中一列或多列的值进行排序的一种存储结构,它是某个表中一列或若干列值的集合和相应的指向表中物理标识这些值的数据页的逻辑指针清单。索引的作用相当于图书的目录,可以根据目录中的页码快速找到所需的内容。
chimchim
2022/11/13
7360
hive索引
Hive 基础操作
hive是基于Hadoop的一个数据仓库工具,用来进行数据提取、转化、加载,这是一种可以存储、查询和分析存储在Hadoop中的大规模数据的机制。hive数据仓库工具能将结构化的数据文件映射为一张数据库表,并提供SQL查询功能,能将SQL语句转变成MapReduce任务来执行。Hive的优点是学习成本低,可以通过类似SQL语句实现快速MapReduce统计,使MapReduce变得更加简单,而不必开发专门的MapReduce应用程序。hive十分适合对数据仓库进行统计分析。
Golvi
2023/11/20
3840
Hive 基础操作
大数据开发:Hive DDL操作入门
Hive针对于数据管理操作,提供了类SQL语言HQL,在Hadoop生态当中,Hive定位为数据仓库工具,对于数据的各种操作,也就是使用HQL来完成。而HQL查询,可以分为DDL和DML两个部分来掌握。今天的大数据开发学习分享,我们就先来讲讲Hive DDL操作入门。
成都加米谷大数据
2021/06/16
4570
大数据开发:Hive DDL操作入门
Hadoop数据仓库工具Hive
Hive是Hadoop的一个模块。它是一个用于开发SQL类型脚本执行MapReduce操作的平台。
yeedomliu
2023/09/03
5730
Hadoop数据仓库工具Hive
Hadoop技术(三)数据仓库工具Hive
在这里可以回顾一下Hadoop的相关知识: 1.x job tracker 既管资源调度又管任务分配 2.x 分为ResourceManager(资源分配)和DataManager(任务分配) 牢记Hadoop 1.x与2.x架构图
时间静止不是简史
2020/07/24
2.1K0
Hadoop技术(三)数据仓库工具Hive
Hadoop Hive sql语法详解
Hive 是基于Hadoop 构建的一套数据仓库分析系统,它提供了丰富的SQL查询方式来分析存储在Hadoop 分布式文件系统中的数据,可以将结构
黄规速
2022/04/14
2.2K0
hive之路7-hive之DDL操作
在Hive中,数据库是一个命名空间或表的集合。创建了数据库之后,在HDFS上的存储路径默认为/usr/hive/warehouse/*.db具体语法为:
皮大大
2021/03/02
6420
hive基本简单操作
1.建表 CREATE [TEMPORARY] [EXTERNAL] TABLE [IF NOT EXISTS] [db_name.]table_name – (Note: TEMPORARY available in Hive 0.14.0 and later) [(col_name data_type [COMMENT col_comment], … [constraint_specification])] [COMMENT table_comment] [PARTITIONED BY (col_name data_type [COMMENT col_comment], …)] [CLUSTERED BY (col_name, col_name, …) [SORTED BY (col_name [ASC|DESC], …)] INTO num_buckets BUCKETS] [SKEWED BY (col_name, col_name, …) – (Note: Available in Hive 0.10.0 and later)] ON ((col_value, col_value, …), (col_value, col_value, …), …) [STORED AS DIRECTORIES] [ [ROW FORMAT row_format] [STORED AS file_format] | STORED BY ‘storage.handler.class.name’ [WITH SERDEPROPERTIES (…)] – (Note: Available in Hive 0.6.0 and later) ] [LOCATION hdfs_path] [TBLPROPERTIES (property_name=property_value, …)] – (Note: Available in Hive 0.6.0 and later) [AS select_statement]; – (Note: Available in Hive 0.5.0 and later; not supported for external tables)
chimchim
2022/11/13
2930
数据科学|Hive SQL语法总结
Hive是一个数据仓库基础的应用工具,在Hadoop中用来处理结构化数据,它架构在Hadoop之上,通过SQL来对数据进行操作,了解SQL的人,学起来毫不费力。
陆勤_数据人网
2019/12/31
1.9K0
(四)Hive分区、分桶
CREATE TABLE IF NOT EXISTS salgrade2 ( GRADE int, LOSAL int, HISAL int ) partitioned by (day string) row format delimited fields terminated by '\t' location '/data/inner/ODS/01/salgrade2';
wolf
2020/09/18
1.2K0
2017年11月1日课后作业Hive 第二次课程DDL内部表、外部表、临时表的创建和特性DML
2017年11月1日课后作业 Hive 第二次课程 回顾上节课的内容 Hive是什么 SQL -> MapReduce 为什么会有Hive 给非Java编程者对HDFS上的数据做MapReduce查询使用 数据仓库 HIve架构 数据是存在HDFS上的 hive-site.xml 我们配置hive.metastore.warehouse.dir 元数据是存在RDBMS 包括,表的名字,字段的名称、类型 还需要存,数据放在HDFS哪个目录上了 计算是基于MapReduce 解释器、编译器、优化器 Oper
Albert陈凯
2018/04/08
7780
hive之路9-hive索引和视图
本文中主要是介绍了hive中索引和视图的相关操作。 修改表 修改表主要是对表的结构和属性进行操作,包含: 重命名 alter table oldname rename to new_table; 修改表属性 alter table table_name set tblproperties (property_name=property_value); 修改表注释 alter table table_name set tblproperties('comment'=new_comment); 修改存储属
皮大大
2021/03/02
7480
hive数据定义语言DDL
显示hive中数据库的名称,注释(如果已经设置),及其在文件系统中的位置等信息
h3110_w0r1d
2024/02/19
2300
hive数据定义语言DDL
Hive学习3:Hive三种建表语句详解
注:hive其他语法在hive官网有说明,建议初学者,去官网学习一手的资料, 官网:https://cwiki.apache.org/confluence/display/Hive/Home#Home-UserDocumentation
全栈程序员站长
2022/10/03
6.2K0
Hive学习3:Hive三种建表语句详解
Hive第二天学习内容总结Hive 第三天DDL特别注意一下,没事别删除数据DML
Hive 第三天 [toc] 第二天内容回顾 Hive帮助文档的地址 https://cwiki.apache.org/confluence/display/Hive/Home Hive SQL Language Manual: Commands, CLIs, Data Types, DDL (create/drop/alter/truncate/show/describe), Statistics (analyze), Indexes, Archiving, DML (load/insert/updat
Albert陈凯
2018/04/08
9380
Hive第二天学习内容总结Hive 第三天DDL特别注意一下,没事别删除数据DML
快速学习-DDL数据定义
1)创建一个数据库,数据库在 HDFS 上的默认存储路径是/user/hive/warehouse/*.db。
cwl_java
2020/02/21
5910
快速学习-DDL数据定义
拿美团offer,Hive基础篇(持续更新中)
Hive 是基于 Hadoop 的一个数据仓库工具,可以将结构化的数据文件映射为一张表,并提供类 SQL查询功能。
木野归郎
2020/06/15
5590
拿美团offer,Hive基础篇(持续更新中)
相关推荐
一文教你学会Hive视图和索引
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验