一、视图

1.1 简介

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

1.2 创建视图

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 查看视图

-- 查看所有视图: 没有单独查看视图列表的语句,只能使用 show tables
show tables;
-- 查看某个视图
desc view_name;
-- 查看某个视图详细信息
desc formatted view_name;

1.4 删除视图

DROP VIEW [IF EXISTS] [db_name.]view_name;

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

1.5 修改视图

ALTER VIEW [db_name.]view_name AS select_statement;

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

1.6 修改视图属性

语法:

ALTER VIEW [db_name.]view_name SET TBLPROPERTIES table_properties;table_properties:: (property_name = property_value, property_name = property_value, ...)

示例:

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 文件路径及偏移量,这样就避免了全表扫描。

+--------------+----------------+----------+--+
|   col_name   |   data_type    | comment     |
+--------------+----------------+----------+--+
| empno        | int            |  建立索引的列  |
| _bucketname  | string         |  HDFS 文件路径  |
| _offsets     | array<bigint>  |  偏移量       |
+--------------+----------------+----------+--+

2.3 创建索引

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 查看索引

--显示表上所有列的索引
SHOW FORMATTED INDEX ON table_name;

2.4 删除索引

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

DROP INDEX [IF EXISTS] index_name ON table_name;

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

2.5 重建索引

ALTER INDEX index_name ON table_name [PARTITION partition_spec] REBUILD;

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

三、索引案例

3.1 创建索引

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

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 重建索引

alter index emp_index on emp rebuild;

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

3.3 自动使用索引

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

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 查看索引

SHOW INDEX ON emp;

四、索引的缺陷

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

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

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

Hive 视图和索引相关推荐

  1. 2020.9.28(Hive视图、索引、权限管理)

    回顾:上节课讲了hive的参数设置,hive的运行方式,hive的动态分区,分桶,lateral view这五个知识点.遗留了两个问题: 1.看一下hive的源码,现在面试中,hive的源码还从来没有 ...

  2. Hive Lateral View、视图、索引

    一.Hive Lateral View 1.Lateral View用于和UDTF函数(explode.split)结合来使用. 2.首先通过UDTF函数拆分成多行,再将多行结果组合成一个支持别名的虚 ...

  3. mysql hive索引_Hive数据仓库--HiveQL视图和索引

    上篇文章中讲完了查询的相关操作,接下来就是视图与索引了,Hive中的视图的作用总的来说就是为了简化查询语句,是一个逻辑上的视图,而不是物化的视图.索引则是加快查询速度的比较重要的手段,之前的Mysql ...

  4. Hive的视图和索引

    目录 一.Hive Lateral View 1.基本介绍 2.Hive表行转列,列转行以及Hive Lateral View在列转行中的使用 二.Hive视图 1.Hive视图基本介绍 2.Hive ...

  5. ElasticSearch-Hadoop:从Hadoop到ElasticSearch的产品视图计数索引和客户顶部搜索查询...

    这篇文章涵盖了如何使用ElasticSearch-Hadoop从Hadoop系统读取数据并在ElasticSearch中对其进行索引. 它涵盖的功能是在最近n天中为每个客户的产品浏览量计数和热门搜索查 ...

  6. Oracle数据库之对象视图、索引、序列、同义词

    Oracle数据库总结: Oracle数据库之集合运算 Oracle数据库之数据处理 Oracle数据库之建表和管理表 Oracle数据库之对象视图.索引.序列.同义词 视图: 语法: create ...

  7. oracle视图和索引,oracle视图和索引

    视图和索引 视图 视图的作用 控制数据访问.简化查询.避免重复访问相同的数据 视图的优点 限制用户只能通过视图检索数据,用户看不到底层基表 注意事项 视图可以理解为临时表,会随着真实表的数据变化而自动 ...

  8. Oracle→序列、视图、索引、存储过程、存储函数、包、触发器、表分区、锁表解锁表、事务、PLSQL、备份恢复、游标

    序列SEQUENCE 视图VIEW 索引 同义词 存储过程 存储函数 包 JAVA调用包 触发器 表分区 锁表解锁表 事务 PLSQL 备份恢复

  9. mysql 索引的模糊查询_MYSQL语法(模糊查询,视图,索引)

    MYSQL语法(模糊查询,视图,索引) 2020年08月11日 | 萬仟网IT编程 | 我要评论 MYSQL模糊查询模糊查询,查询name 以张开头的数据select *from t1 where n ...

最新文章

  1. 用python画爱心的代码-怎么用python实现画爱心
  2. linux 连接文件,Linux 链接文件
  3. BZOJ3110: [Zjoi2013]K大数查询
  4. python 3des加密_python – 使用3DES和CBC破坏我的加密数据的前8个字节
  5. 计算机网络知识学习(核心:网络协议)-- 应用层
  6. Second kill system learning
  7. iOS中的Runloop
  8. 基于php技术的Web的电子病历管理系统
  9. Win10系统修改开机密码
  10. 如何旋转PDF页面并保存
  11. Imu_heading使用
  12. 【Eslint + Prettier + Husky + Commitlint】前端项目代码规范的搭建
  13. android 布局滑动消失,SlideUp-Android
  14. Unity人工智能之不断自我进化的五人足球赛
  15. 求助:tp-link wr720n路由器,想刷打印服务器!
  16. MATLAB设置起始文件夹
  17. C++:函数指针进阶(四):函数对象operator()
  18. 火狐浏览器无法启动java_打开火狐浏览器出现错误
  19. 国科大学习资料--最优化计算方法(王晓)--期末考试试卷历年题按题型汇总
  20. java异常标记_如何修复'java.io.IOException异常:toDerInputStream在上启动spring应用程序时拒绝标记类型60'本地主机:8443...

热门文章

  1. win10系统声音很大,音频播放声音特小的问题
  2. 2008文件服务器没有写入权限,2008文件服务器权限设置
  3. 业务架构、应用架构、数据架构、技术架构
  4. 文件搜索工具android,Search Everything下载
  5. 【C4AI-2022】基于飞桨的跨平台智慧农业遥感监测平台
  6. Dundas Chart for .NET 控件的简单使用
  7. 使用 139邮箱免费给任何移动手机发短信
  8. adobe pdf 启用下划线快捷键
  9. linux中qt加载rviz,ROS与Qt5人机交互界面开发-添加rviz显示界面
  10. 信号与系统 学习笔记 Signals and Systems with Python