视图是纯逻辑对象并不关联任何存储,下面的语句使用给定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, ...)
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