`
superlxw1234
  • 浏览: 542305 次
  • 性别: Icon_minigender_1
  • 来自: 西安
博客专栏
Bd1c0a0c-379a-31a8-a3b1-e6401e2f1523
Hive入门
浏览量:43208
社区版块
存档分类
最新评论

Hive索引原理机制与使用

    博客分类:
  • hive
阅读更多

 

文章来自: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中会创建一张索引表,也是物理表:

 

 

http://7xipth.com1.z0.glb.clouddn.com/0507-3.jpg

 

 

其中,索引表中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

1
1
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics