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; 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章