Hive 视图和索引:通过示​​例创建

⚡ 智能摘要

Hive 中的视图是保存的查询,其行为类似于只读表;索引是指向列的指针,可以加快查找速度。两者都使用此处所示的简短 HiveQL 语句创建。

  • 👁️ 观点合乎逻辑: 视图只在元数据存储中存储其 SELECT 语句,因此它本身不占用任何磁盘空间。
  • 🔒 设计为只读: 视图不能成为 LOAD、INSERT 或 ALTER 操作的目标,因为 Hive 会在每次查询时重新评估视图。
  • 📍 指数指向数据: 索引是指向列值的指针,它允许 Hive 读取文件的一部分而不是整个表。
  • 🗂️ 两名处理人员: 紧凑索引适用于高基数列,位图索引适用于具有少量不同值的列。
  • 🔄 手动重建: 索引永远不会自动刷新,因此在基表更改后必须运行 ALTER INDEX REBUILD。
  • 🚫 已在 Hive 3.0 中移除: HIVE-18448 版本取消了索引功能,取而代之的是物化视图、ORC 或 Parquet 存储和分区。

通过示例讲解 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 中,索引仍然有效,但对于新的工作,上述选项之一会更加适用。

常见问题

DROP VIEW view_name 会删除视图,而 ALTER VIEW view_name RENAME TO new_name 会重命名视图。因为视图不包含任何数据,所以删除操作无效。ping 基本表不会被修改;只会消失元数据存储条目。

物化视图将预先计算的查询结果作为实际数据存储,因此会占用磁盘空间并需要重新构建。普通视图仅存储查询文本,每次引用时都会重新计算。

不。元数据存储只保存 SELECT 语句和解析后的列列表,仅此而已。每次引用都会重新运行底层查询,这就是为什么基于慢连接创建的视图仍然很慢的原因。

在 Hive 0.12.0 及更早版本中,CREATE INDEX 和 DROP INDEX 语句的索引名称区分大小写,而 ALTER INDEX 语句的索引名称则必须小写。Hive 0.13.0 版本则对所有语句的索引名称都取消了大小写限制。

是的,在任何现代集群上都可以。分区修剪会在扫描开始前删除整个目录,而分桶则会将连接或采样范围缩小到特定文件,这通常比索引表的效果更好。

机器学习工具会对查询日志进行分析,根据选择性和频率对谓词列进行排序,并建议在哪些情况下使用物化视图或分区方案效果最佳。在应用任何建议之前,请务必使用 EXPLAIN 计划对其进行验证。

它可以根据简短的注释可靠地生成 CREATE VIEW 语句。请检查版本相关的设置,因为它仍然会生成 Hive 3.0 或更高版本集群会直接拒绝的 CREATE INDEX 语法。

索引是一个独立的指针表,Hive 不会在基表更改时刷新它。如果不重建索引,指针就会失效,因此优化器要么跳过该索引,要么返回过时的匹配项。

总结一下这篇文章: