Hive 视图和索引:通过示例创建
什么是视图?
视图类似于表,它们根据需求生成。视图是一个纯粹的逻辑对象,本身不存储任何数据:Hive 只在元数据存储中保存查询文本,并在每次引用视图时执行该查询。
- 我们可以将任何结果集数据保存为 Hive 中的视图
- 用法与视图类似 SQL
- 视图是只读的,因此不能作为写入数据的 LOAD、INSERT 或 ALTER 语句的目标。
视图的创建:
语法:
Create VIEW <VIEWNAME> AS SELECT
完整的文档形式还接受 IF NOT EXISTS 子句和可选的列列表,当 SELECT 列表包含表达式而不是纯列名时,这非常有用。
计费示例:
Hive>Create VIEW Sample_View AS SELECT * FROM employees WHERE salary>25000
在这个例子中,我们创建了视图 Sample_View,它显示所有薪资字段大于 25000 的行值。筛选器位于视图内部,因此任何从 Sample_View 中选择的查询都只会看到这些行。
什么是索引?
索引是指向表中特定列名的指针。索引的目标是提高查找速度:如果没有索引,带有谓词的查询(例如 `SELECT * FROM TABLE`)将非常缓慢。 其中 tab1.col1 = 10 加载整个表或分区并处理每一行,而 col1 上的索引则允许 Hive 只读取文件的一部分。
- 用户必须手动定义索引
- 无论何时创建索引,都意味着创建指向表中特定列名的指针。
- 对表中列所做的任何更改都会使用基于列名创建的索引值进行存储。
这种速度提升并非没有代价。构建索引需要额外的处理资源,而且索引本身会占用磁盘空间,这些空间必须与表一起维护。
语法:
Create INDEX <INDEX_NAME> ON TABLE <TABLE_NAME(column names)>
计费示例:
Create INDEX sample_Index ON TABLE guruhive_internaltable(id)
这里我们在 guruhive_internaltable 表上为 id 列创建索引。请注意,对于仍然支持索引的版本,完整的语句还需要一个索引处理程序子句,下一节将详细介绍。
Hive 中视图和索引的区别
视图和索引经常被一起介绍,因为它们都建立在现有表之上,但它们解决的问题却不尽相同。视图改变了查询所看到的内容,而索引则提高了 Hive 查找数据的速度。下表对它们进行了比较。
| 方面 | 查看 | 索引 |
|---|---|---|
| 它储存了什么 | 元存储中只有 SELECT 语句 | 一个单独的索引表,保存指向数据的指针 |
| 目的 | 简化或限制查询返回的内容 | 减少谓词扫描的数据量 |
| 磁盘成本 | 没有 | 额外存储空间以及数据更改后的重建 |
| 写权限 | 只读 | 并非直接查询;而是由优化器使用。 |
| 当前状态 | 完全支持 | 已在 Hive 3.0 中移除 |
实际上,创建视图是为了提高可读性和控制访问,而创建索引则纯粹是为了提高特定列的性能。
Hive 中的索引类型及语法
Hive 2.x 及更早版本都提供了两个索引处理器,处理器名称在强制性的 AS 子句中指定。紧凑索引在 Hive 0.7.0 中引入,位图索引在 Hive 0.8.0 中引入。
- 简明指数: 它将值与其所在的 HDFS 数据块地址一起存储,而不是记录每次出现的位置。这种方法适用于包含大量不同值的列。
- 位图索引: 每个不同的值存储一个位图,这是只有少量不同值的列(例如状态或性别标志)的常用方法。
创建、列出和删除紧凑索引的操作如下:
CREATE INDEX table01_index ON TABLE table01 (column2) AS 'COMPACT'; SHOW INDEX ON table01; DROP INDEX table01_index ON table01;
WITH DEFERRED REBUILD 选项会注册索引但不填充数据,因此可以使用 ALTER INDEX 单独安排构建过程。位图索引的创建方式相同,只是处理程序名称不同:
CREATE INDEX table03_index ON TABLE table03 (column4) AS 'BITMAP' WITH DEFERRED REBUILD; ALTER INDEX table03_index ON table03 REBUILD; SHOW FORMATTED INDEX ON table03; DROP INDEX table03_index ON table03;
索引不会自动刷新。每当基表接收到新数据时,都必须再次运行 ALTER INDEX … REBUILD 命令;对于分区表,重建操作可能仅限于单个分区。
为什么 Hive 3.0 中移除了索引功能
Hive 3.0 版本(HIVE-18448)中移除了索引功能,因此当前集群中已不再支持 CREATE INDEX、SHOW INDEX 和 DROP INDEX 命令。随着列式存储和基于成本的优化器的成熟,重建索引功能的成本已变得非常高昂。目前已有三种替代方案可以实现相同的功能。
- 物化视图: 在 Hive 3.0.0 中引入, 物化视图 存储查询的预计算结果,优化器会自动根据该结果重写传入的查询。
- 列式文件格式: ORC 和 Parquet 都带有自己的轻量级索引和最小/最大统计信息,因此读取器可以跳过整个条带、块或文件,而无需任何用户定义的索引。
- 分区和存储桶: 分区和存储桶 在目录和文件级别修剪数据,这通常会删除比索引删除的更多的输入。
在 Hive 2.x 中,索引仍然有效,但对于新的工作,上述选项之一会更加适用。

