hive中如何建立索引
阿新 • • 發佈:2019-02-15
索引的作用
Hive支援索引,但是Hive的索引與關係型資料庫中的索引並不相同,比如,Hive不支援主鍵或者外來鍵。
Hive索引可以建立在表中的某些列上,以提升一些操作的效率,例如減少MapReduce任務中需要讀取的資料塊的數量。
在可以預見到分割槽資料非常龐大的情況下,索引常常是優於分割槽的。
雖然Hive並不像事物資料庫那樣針對個別的行來執行查詢、更新、刪除等操作。它更多的用在多工節點的場景下,快速地全表掃描大規模資料。但是在某些場景下,建立索引還是可以提高Hive表指定列的查詢速度。(雖然效果差強人意)
索引適用的場景
適用於不更新的靜態欄位。以免總是重建索引資料。每次建立、更新資料後,都要重建索引以構建索引表。
Hive索引的機制如下:
hive在指定列上建立索引,會產生一張索引表(Hive的一張物理表),裡面的欄位包括,索引列的值、該值對應的HDFS檔案路徑、該值在檔案中的偏移量;
v0.8後引入bitmap索引處理器,這個處理器適用於排重後,值較少的列(例如,某欄位的取值只可能是幾個列舉值)
因為索引是用空間換時間,索引列的取值過多會導致建立bitmap索引表過大。
但是,很少遇到hive用索引的。說明還是有缺陷or不合適的地方的。
索引的建立與使用
語法如下:
- 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類。
建立完索引之後 需要重建索引資料,會觸發一個mr job
- ALTER INDEX employee_index
- ON TABLE employee
- PARTITION (country = 'US')
- REBUILD;
建立完可以通過顯示命令顯示索引
SHOW FORMATTED INDEX ON employees;
想要索引在查詢時,生效,還得設定使用索引:預設是不使用的。
- 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;
DROP INDEX IF EXISTS employees_index ON TABLE employees;