1. 程式人生 > >hive中如何建立索引

hive中如何建立索引

索引的作用

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

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

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

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

索引適用的場景

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

Hive索引的機制如下:

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

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

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

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

索引的建立與使用

語法如下:

  1. CREATE INDEX index_name 
  2. ON TABLE base_table_name (col_name, ...)
  3. AS 'index.handler.class.name'
  4. [WITH DEFERRED REBUILD]
  5. [IDXPROPERTIES (property_name=property_value, ...)]
  6. [IN TABLE index_table_name]
  7. [PARTITIONED BY (col_name, ...)]
  8. [
  9.    [ ROW FORMAT ...] STORED AS ...
  10.    | STORED BY ...
  11. ]
  12. [LOCATION hdfs_path]
  13. [TBLPROPERTIES (...)]
  14. [COMMENT "index comment"]

AS ...語句指定了 索引處理器,也就是一個實現了索引介面的Java類。

建立完索引之後 需要重建索引資料,會觸發一個mr job

  1. ALTER INDEX employee_index
  2. ON TABLE employee
  3. PARTITION (country = 'US')
  4. REBUILD;

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

SHOW FORMATTED INDEX ON employees;

想要索引在查詢時,生效,還得設定使用索引:預設是不使用的。

  1. SET hive.input.format=org.apache.hadoop.hive.ql.io.HiveInputFormat;
  2. SET hive.optimize.index.filter=true;
  3. SET hive.optimize.index.filter.compact.minsize=0;
最後,刪除索引的語法如下:
DROP INDEX IF EXISTS employees_index ON TABLE employees;