4.索引

概述

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

  • Hive只有有限的索引功能。Hive中没有普通关系数据库中的键的概念,但是还可以对一些字段建立索引来加速某些操作。

原理

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

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

索引操作

创建索引

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"];  --索引注释
  • as指定索引处理器,实现索引接口的Java类。

  • IN table可以使用索引处理器在一张新表中保留索引数据。

Bitmap索引

create index test_index_in on table test_index(name) 
as 'bitmap' 
with deferred rebuild in table user_index_table; 

重建索引

  • 如果用户指定来deferred rebuild,那么新索引将呈现空白状态。

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

ALTER INDEX index_name ON table_name [PARTITION partition_spec] REBUILD;

查看索引

show index on table_name; 
# 显示列名 
show formatted index on table_name; 

删除索引

  • 如果有索引表,删除一个索引将会删除这个索引表。

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

drop index if not exists index_name on table table_name; 
  • hive不允许用户直接drop table语句之前删除索引表

实现一个定制化的索引处理器

https://cwiki.apache.org/confluence/display/Hive/IndexDev#CREATE_INDEX 

索引使用案例

创建索引

  • test_index表创建h_index,索引表存在在h_index_table索引表中

create index h_index on table test_index(id) as 'org.apache.hadoop.hive.ql.index.compact.CompactIndexHandler' with deferred rebuild in table h_index_table;

重建索引

alter index h_index on test_index rebuild;

自动使用索引

  • 默认情况下,虽然建立了索引,但是 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;

索引的缺陷

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

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

    • 具有自动重写的物化视图 (Materialized View) 可以产生与索引相似的效果(Hive 2.3.0 增加了对物化视图的支持,在 3.0 之后正式引入)。

    • 使用列式存储文件格式(Parquet,ORC)进行存储时,这些格式支持选择性扫描,可以跳过不需要的文件或块。

最后更新于