HiveQL索引
Hive只有有限的索引功能。Hive中沒有普通關係型數據庫中鍵的概念,但是還是可以對一些字段建立索引來加速某些操作的。一張表的索引數據存儲在另外一張表中。
當邏輯分區實際上太多太細而幾乎無法使用時,建立索引也就成爲分區的另一個選擇。
建立索引可以幫助裁剪掉一張表的一些數據塊,這樣能夠減少MapReduce的輸入數據量。並非所有的查詢都可以通過建立索引獲得好處。通過EXPLAIN命令可以查看某個查詢語句是否用到了索引。
Hive中的索引和那些關係型數據庫中的一樣,需要進行仔細評估才能使用。維護索引也需要額外的存儲空間,同時創建索引也需要消耗計算資源。用戶需要在建立索引爲查詢帶來的好處和因此而需要付出的代價之間做出權衡。
創建索引
CREATE INDEX indexname
ON TABLE tablename [(cloname)]
AS 'org.apache.hadoop.hive.ql.index.compact.CompactIndexHandler'
WITH DEFERRED REBUILD;
這是簡單創建索引的語句,還有一些其他的內容可以加進來,當需要時再補充。
as… 語句指定了索引處理器,也就是一個實現索引接口的Java類。Hive本身包含了一些典型的索引實現。具體見我另一篇博客。
除了內部表,Hive還可以對外部表和視圖建立索引。
重建索引
如果用戶指定了 DEFERRED REBUILD
,那麼新索引將呈現空白狀態,再任何時候都可以進行第一次索引創建或者使用 ALTER INDEX
對索引進行重建。
如果在重建時省略掉了 PARTTION
那麼將會對所有分區進行重建索引。
顯示索引
下面這個命令將顯示對於這個索引表對所有列所建立的索引:
SHOW FORMATTED INDEX ON employees;
關鍵字FORMATTED是可選的。增加這個關鍵字可以使輸出中包含有列名稱。用戶還可以替換 INDEX 爲INDEXES,這樣輸出中就可以列舉出多個索引信息了。
刪除索引
如果有索引表的話,刪除一個索引將會刪除這個索引表:
DROP INDEX IF EXISTS employees index ON TABLE employees;
Hive 不允許用戶直接使用DROP TABLE 語句之前刪除索引表。而通常情況下,IF EXISTS 都是可選的,其用於當索引不存在時避免拋出錯誤信息。
如果被索引的表被刪除了,那麼其對應的索引和索引表也會被刪除。同樣地,如果原始表的某個分區被刪除了,那麼這個分區對應的分區索引也同時會被刪除掉。