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;