视图在Hive的用法和SQL视图用法相同。它是一个标准的RDBMS概念。我们可以在视图上执行所有DML操作。
创建视图
视图是纯逻辑对象并不关联任何存储,下面的语句使用给定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)
创建一个视图
可以创建一个视图,在执行SELECT语句的时候。语法如下:
CREATE VIEW [IF NOT EXISTS] view_name [(column_name [COMMENT column_comment], ...) ] [COMMENT table_comment] AS SELECT ...
示例
举个例子来看。假设employee表拥有如下字段:Id, Name, Salary, Designation 和 Dept。生成一个查询检索工资超过30000卢比的员工详细信息,我们把结果存储在一个名为视图 emp_30000.
+------+--------------+-------------+-------------------+--------+ | ID | Name | Salary | Designation | Dept | +------+--------------+-------------+-------------------+--------+ |1201 | Gopal | 45000 | Technical manager | TP | |1202 | Manisha | 45000 | Proofreader | PR | |1203 | Masthanvali | 40000 | Technical writer | TP | |1204 | Krian | 40000 | Hr Admin | HR | |1205 | Kranthi | 30000 | Op Admin | Admin | +------+--------------+-------------+-------------------+--------+
下面使用上述业务情景查询检索员的工详细信息:
hive> CREATE VIEW emp_30000 AS > SELECT * FROM employee > WHERE salary>30000;
删除视图
删除视图将会移除指定视图的元数据,当删除被其它视图引用的视图时,不会给出警告信息,依赖该视图的视图将会失效,必须手动删除或者重新创建。删除视图的语法如下:
DROP VIEW view_name
下面的查询删除一个名为emp_30000的视图:
hive> DROP VIEW emp_30000;
修改视图属性
修改视图属性的语句为:
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"]
例子
让我们举个索引例子。使用之前的字段 Id, Name, Salary, Designation, 和 Dept创建一个名为index_salary的索引,对employee 表的salary列索引。
下面的查询创建一个索引:
hive> CREATE INDEX inedx_salary ON TABLE employee(salary) > AS 'org.apache.hadoop.hive.ql.index.compact.CompactIndexHandler';
这是一个指向salary列。如果列被修改,变更使用的索引值存储。
删除索引
下面的语法用来删除索引:
DROP INDEX <index_name> ON <table_name>
下面的查询删除名为index_salary索引:
hive> DROP INDEX index_salary ON employee;
修改索引
下面的语句为使用WITH DEFERRED REBUILD子句的索引创建索引,或者重建已经创建的索引,如果指定分区,仅有该分区被重建。
ALTER INDEX index_name ON table_name [PARTITION partitionSpec] REBUILD
感觉本站内容不错,读后有收获?小额赞助,鼓励网站分享出更好的教程