Hive學習之檢視、索引DDL
建立檢視
檢視是純邏輯物件並不關聯任何儲存,下面的語句使用給定view_name名稱建立檢視,若view_name與現存的表或者檢視重名,則出錯。
CREATE VIEW [IF NOT EXISTS] view_name [(column_name [COMMENT column_comment], ...) ] [COMMENT view_comment]
[TBLPROPERTIES(property_name = property_value, ...)]
AS SELECT ...
在該語句中若不提供列名,檢視的列名將根據SELECT .子句生成,如果SELECT.子句包含沒有別名的標量表達式如x+y,檢視的列名將按照_C0,_C1等形式產生。當重新命名列名時可以指定列註釋。若SELECT .子句無效則建立檢視將會失敗。
當被建立時,檢視的schema是凍結的,對當前表的後續修改不會影響到檢視的schema。如果當前表被刪除或者改變,後續對檢視的查詢將會失敗。檢視是隻讀的,不能作為LOAD/INSERT的目標。一個檢視可以包含ORDERBY和LIMIT從句,如果查詢該檢視的語句也包含這些從句,查詢層級的從句將會在檢視從句之後計算。例如檢視指定了LIMIT 5,相關查詢語句為select from v LIMIT 10,那麼最多5行記錄被返回。建立檢視的例子如下:
hive> create view test_view as select * from test; OK Time taken:0.818 seconds hive>describe test; OK a1 string b1 string c1 string d int # PartitionInformation # col_name data_type comment d int Time taken:0.315 seconds, Fetched: 9 row(s) hive>describe test_view; OK a1 string b1 string c1 string d int Time taken:0.212 seconds, Fetched: 4 row(s)
刪除檢視
刪除檢視將會移除指定檢視的元資料,當刪除被其它檢視引用的檢視時,不會給出警告資訊,依賴該檢視的檢視將會失效,必須手動刪除或者重新建立。刪除檢視的語句如下:
DROP VIEW [IF EXISTS] view_name
修改檢視屬性
修改檢視屬性的語句為:
ALTER VIEW view_name SET TBLPROPERTIES table_properties
table_properties:
: (property_name = property_value,property_name = property_value, ...)
修改檢視的AS SELECT子句
ALTER VIEW view_name AS select_statement
修改檢視的AS SELECT子句會改變檢視的定義,需要注意的是要修改的檢視必須已經存在,如果檢視擁有分割槽,分割槽將不會被Alter View As Select替代。
建立/刪除/修改索引
建立索引
建立索引的語句如下,該語句使用給定的列集合在表上建立索引。index.handler.class.name指定了索引處理器,如org.apache.hadoop.hive.ql.index.compact.CompactIndexHandler。如果使用WITH DEFERRED REBUILD子句,那麼新的索引被初始化為空的,無論表中是否含有資料。預設情況下,索引的分割槽匹配表的分割槽,PARTITIONED BY子句可以用來指定表分割槽的子集(該子集也可以是空的用以指示索引覆蓋表的所有分割槽),例如一個表被date和region分割槽,索引的分割槽僅有date,那麼索引的分割槽將會覆蓋所有的region分割槽。在同一個資料庫中,索引名稱可以用於多個表,這是因為索引名稱是包含表名的全限定名稱。在不指定儲存索引的名稱時,索引被儲存在名為資料庫名__表名_索引名__的表中。
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]
[
[ ROW FORMAT ...] STORED AS ...
| STORED BY ...
]
[LOCATION hdfs_path]
[TBLPROPERTIES(...)]
[COMMENT"index comment"]
刪除索引
DROP INDEX [IFEXISTS] index_name ON table_name
刪除索引的同時也刪除儲存索引的表。
修改索引
下面的語句為使用WITH DEFERRED REBUILD子句的索引建立索引,或者重建已經建立的索引,如果指定分割槽,僅有該分割槽被重建。
ALTER INDEX index_name ON table_name [PARTITION partitionSpec] REBUILD