欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Hive索引原理机制与使用

程序员文章站 2022-05-30 20:22:11
...

 

文章来自:http://lxw1234.com/archives/2015/05/207.htm

 

Hive是支持索引的,但基本没用过,只做了下试验。
为什么大家都不用,肯定有它的弊端。

 

Hive索引机制:

 

在指定列上建立索引,会产生一张索引表(Hive的一张物理表),里面的字段包括,索引列的值、该值对应的HDFS文件路径、该值在文件中的偏移量;

 

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

 

Hive索引建立过程:

  • 创建索引:

 

create index lxw1234_index on table lxw1234(key)
as 'org.apache.hadoop.hive.ql.index.compact.CompactIndexHandler'
with deferred rebuild;

 之后在Hive中会创建一张索引表,也是物理表:

 

 

Hive索引原理机制与使用
            
    
    博客分类: hive hivehive indexhive 索引 

 

 

其中,索引表中key字段,就是原表中key字段的值,_bucketname 字段,代表数据文件对应的HDFS文件路径,_offsets 代表该key值在文件中的偏移量,有可能有多个偏移量,因此,该字段类型为数组。

其实,索引表就相当于一个在原表索引列上的一个汇总表。

  • 生成索引数据

alter index lxw1234_index on lxw1234 rebuild;

 用一个MR任务,以table lxw1234的数据作为input,将索引字段key中的每一个值及其对应的HDFS文件和偏移量输出到索引表中。

  • 自动使用索引

  • 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;
     查询时候索引如何起效:
select * from lxw1234 where key = '13400000144_1387531071_460606566970889';

 

       剩下的流程图不贴了,到原文看吧: http://lxw1234.com/archives/2015/05/207.htm