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

相关内容