Hive建立索引

hiekay發表於2018-11-28
1.索引的作用

Hive支援索引,但是Hive的索引與關係型資料庫中的索引並不相同,比如,Hive不支援主鍵或者外來鍵。

Hive索引可以建立在表中的某些列上,以提升一些操作的效率,例如減少MapReduce任務中需要讀取的資料塊的數量。

在可以預見到分割槽資料非常龐大的情況下,索引常常是優於分割槽的。

雖然Hive並不像事物資料庫那樣針對個別的行來執行查詢、更新、刪除等操作。它更多的用在多工節點的場景下,快速地全表掃描大規模資料。但是在某些場景下,建立索引還是可以提高Hive表指定列的查詢速度。(雖然效果差強人意)

2.索引適用的場景

適用於不更新的靜態欄位。以免總是重建索引資料。每次建立、更新資料後,都要重建索引以構建索引表。

3.Hive索引的機制如下:

hive在指定列上建立索引,會產生一張索引表(Hive的一張物理表),裡面的欄位包括,索引列的值、該值對應的HDFS檔案路徑、該值在檔案中的偏移量;

v0.8後引入bitmap索引處理器,這個處理器適用於排重後,值較少的列(例如,某欄位的取值只可能是幾個列舉值)

因為索引是用空間換時間,索引列的取值過多會導致建立bitmap索引表過大。

但是,很少遇到hive用索引的。說明還是有缺陷or不合適的地方的。

4.索引的建立與使用

語法如下:

CREATE INDEX index_name 
ON TABLE base_table_name (col_name, ...)
AS `index.handler.class.name`
[WITH DEFERRED REBUILD]
[IDXPROPERTIES (property_name=property_value, ...)]
[IN TABLE index_table_name]
[PARTITIONED BY (col_name, ...)]
[
   [ ROW FORMAT ...] STORED AS ...
   | STORED BY ...
]
[LOCATION hdfs_path]
[TBLPROPERTIES (...)]
[COMMENT "index comment"]
AS ...語句指定了 索引處理器,也就是一個實現了索引介面的Java類。
5.建立完索引之後 需要重建索引資料,會觸發一個mr job
ALTER INDEX employee_index
ON TABLE employee
PARTITION (country = `US`)
REBUILD;

6.建立完可以通過顯示命令顯示索引

SHOW FORMATTED INDEX ON employees;
7.想要索引在查詢時,生效,還得設定使用索引:預設是不使用的。
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;
8. 刪除索引
DROP INDEX IF EXISTS employees_index ON TABLE employees;


相關文章