1. 程式人生 > >Hive學習之檢視、索引DDL

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