Hive索引原理机制与使用
程序员文章站
2022-05-30 20:22:17
...
文章来自: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中会创建一张索引表,也是物理表:
其中,索引表中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