LanguageManual Indexing

自 3.0 起删除索引

还有一些替代选项可能与索引相似:

  • 具有自动重写的实例化视图可以产生非常相似的结果。 Hive 2.3.0添加了对实例化视图的支持。

  • 使用柱状文件格式(ParquetORC)–他们可以进行选择性扫描;他们甚至可能会跳过整个文件/块。

Note

索引已在 3.0 版(HIVE-18448)中被“删除”。

Hive 索引概述

Hive 索引的目标是提高对表的某些列的查询查找的速度。如果没有索引,则使用谓词(例如“ WHERE tab1.col1 = 10”)的查询会加载整个表或分区并处理所有行。但是,如果存在 col1 的索引,则只需要加载和处理文件的一部分。

索引可以提供的查询速度的提高是以创建索引和创建索引所需的额外处理为代价的。

Versions

在 0.7.0 版中添加了 Hive 索引,在 0.8.0 版中添加了位图索引。

Indexing Resources

可以在以下位置找到有关如何使用 Hive 索引的文档和示例:

Hive 索引的配置参数

Configuration Properties文档描述了配置 Hive 索引的参数。

Simple Examples

本节提供一些改编自 Hive 测试套件的索引示例。

Case sensitivity

在 Hive 0.12.0 和更早版本中,对于 CREATE INDEX 和 DROP INDEX 语句,索引名称区分大小写。但是,ALTER INDEX 需要使用小写字母创建的索引名称(请参见HIVE-2752)。通过使所有 HiveQL 语句的索引名称不区分大小写,此错误已在Hive 0.13.0中修复。对于 0.13.0 之前的版本,最佳实践是对所有索引名称使用小写字母。

创建/构建,显示和删除索引:

CREATE INDEX table01_index ON TABLE table01 (column2) AS 'COMPACT';
SHOW INDEX ON table01;
DROP INDEX table01_index ON table01;

先创建再构建,显示格式化的(带有列名)并删除索引:

CREATE INDEX table02_index ON TABLE table02 (column3) AS 'COMPACT' WITH DEFERRED REBUILD;
ALTER INDEX table02_index ON table2 REBUILD;
SHOW FORMATTED INDEX ON table02;
DROP INDEX table02_index ON table02;

创建位图索引,生成,显示和删除:

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;

在新表中创建索引:

CREATE INDEX table04_index ON TABLE table04 (column5) AS 'COMPACT' WITH DEFERRED REBUILD IN TABLE table04_index_table;

创建存储为 RCFile 的索引:

CREATE INDEX table05_index ON TABLE table05 (column6) AS 'COMPACT' STORED AS RCFILE;

创建存储为文本文件的索引:

CREATE INDEX table06_index ON TABLE table06 (column7) AS 'COMPACT' ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t' STORED AS TEXTFILE;

创建具有索引属性的索引:

CREATE INDEX table07_index ON TABLE table07 (column8) AS 'COMPACT' IDXPROPERTIES ("prop1"="value1", "prop2"="value2");

使用表属性创建索引:

CREATE INDEX table08_index ON TABLE table08 (column9) AS 'COMPACT' TBLPROPERTIES ("prop3"="value3", "prop4"="value4");

删除索引(如果存在):

DROP INDEX IF EXISTS table09_index ON table09;

在分区上重建索引:

ALTER INDEX table10_index ON table10 PARTITION (columnX='valueQ', columnY='valueR') REBUILD;