Hive索引的目标就是为了提高表中确定的列的查询速度.没有索引,查询,类似于带有谓词WHEREcol=val这样的查询会加载整张表或者分区然后扫面所有行,如果在col这个列上我们建了索引,那么我们仅仅只需要家在一份文件,然后进行处理。 

与传统关系型数据库一样,增加索引在提升查询性能的时候,会消耗额外的资源去创建索引和需要更多磁盘空间存储索引数据 

一 创建、更改和删除索引

1.1创建索引

CREAT EINDEX index_name ON TABLE table_name (col_name,……)
ASindex_type [WITH DEFERRED REBUILD]
[IDXPROPERTIES(property_name=property_valaue,……)]
[INTABLE index_table_name]
[
      [ROW FORMAT ……] STORED AS ……
      |STORED BY……
]
[LOCATION hdfs_path]
[TBLPROPERTIES(……)]
[COMMENTcomment]
 
CREATEINDEX movie_index ON TABLE movie(mid)
AS'org.apache.hadoop.hive.ql.index.compact.CompactIndexHandler'
WITHDEFERRED REBUILD
INTABLE movie_id_idx;

 分析:

ASindex_type: 指定索引的处理器或者索引类型,实现了索引接口的Java 类,Hive本身包含一些典型的索引实现,比如Compact索引以及Bitmap索引(一般用于排重后值较少的列)

WITHDEFERRED REBUILD: 如果用户指定,那么新索引将呈现空白状态。需要使用ALTER INDEX对索引进行重建。

 1.2删除索引

DROP INDEX [IF EXISTS] index_name ON table_name;
DROP INDEX IF EXISTS movie_index ON movie;

1.3更改索引

ALTER INDEX index_name ON table_name [PARTITION part_spec] REBUILD;

如果省略掉PARTITION,将会对所有分区重建索引

还没有机制嫩能够在底层的表或者某个特定的分区发生改变时,自动触发重建索引

ALTER TABLE movie_index ON movie REBUILD;

二 SHOW INDEX 查看索引

SHOW(INDEX|INDEXES) ON TABLE table [(FROM|
IN)db_name];
hive(hadoop)> show index on director;
OK
idx_name tab_name col_names idx_tab_name      idx_type   comment
direcotr_indexdirector  id   director_id_idx compact

 三 索引原理

在指定列上创建索引,会产生一张额外的表,里面包括索引字段,以及该值所对应的HDFS文件路径,和该值在文件中的偏移量。

在执行索引字段查询的时候,首先生成一个额外的MR Job,根据对索引列的过滤条件,从索引表中过滤出索引列的值对应的HDFS文件路径以及偏移量,输出带hdfs一个文件中,然后根据这些文件的hdfs路径和偏移量筛选原始的input文件生成新的split,作为真个job的split,这样就可以不用全表扫描。

 四 索引 分区

一般来说,如果分区够用也就不必建立索引,但是如果一个表的逻辑分区很多很多,这时候,分区可能就不太适合。 

建索引可以裁剪掉一张表的一些数据块,这样能够减少MapReduce的输入数据。