hive的索引机制

1)建立索引

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

hive的索引是需要手动进行维护的

 

 

2)利用索引查询数据

① 在执行索引字段查询时候,首先额外生成一个MR job,根据对索引列的过滤条件,从索引表中过滤出索引列的值对应的hdfs文件路径及偏移量,输出到hdfs上的一个文件中。

② 然后根据生成的临时文件中的hdfs路径和偏移量,筛选原始input文件,生成新的split,作为整个job的split,这样就达到不用全表扫描的目的。

每次查询时候都要先用一个job扫描索引表,如果索引列的值非常稀疏,那么索引表本身也会非常大;

索引列不适合离散字段。

3)更新索引

索引表不会自动rebuild,如果表有数据新增或删除,那么必须手动rebuild索引表数据;

-- 建立索引
create index uis_aid_index on table user_install_status(aid) as 'org.apache.hadoop.hive.ql.index.compact.CompactIndexHandler'
with deferred rebuild IN TABLE index_uis_aid;


CompactIndexHandler
通过将列中相同的值的字段进行压缩从而减小存储和加快访问时间。
需要注意的是Hive创建压缩索引时会将索引数据也存储在Hive表中。
对于表tb_index (id int, name string) 而言,建立索引后的索引表中默认的三列一次为索引列(id)、hdfs文件地址(_bucketname)、偏移量(offset)。特别注意,offset列类型为array。
                     
-- 更新索引数据
alter index uis_aid_index on user_install_status rebuild;

--自动使用索引
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; --压缩索引自动应用的最小输入大小,默认是5368709120字节

-- 查看索引
SHOW INDEX on user_install_status;    

-- 删除索引
DROP INDEX uis_aid_index on user_install_status; 

 要查询时用索引需要以下步骤:

1)建索引

create index index_aid on table user_install_status(aid) as 'org.apache.hadoop.hive.ql.index.compact.CompactIndexHandler' with deferred rebuild
IN TABLE index_table_user; 

发布了95 篇原创文章 · 获赞 0 · 访问量 1060

猜你喜欢

转载自blog.csdn.net/weixin_43006131/article/details/103264582