视图是一个逻辑结构。不像表会存储真实的数据。目前暂不支持物化视图。
7.1 使用视图来降低查询复杂度
假若有如下的嵌套子查询:
FROM (
SELECT * FROM people JOIN cart
ON (cart.people_id=people.id) WHERE firstname='john'
) a SELECT a.lastname WHERE a.id=3;
创建视图
CREATE VIEW shorter_join AS
SELECT * FROM people JOIN cart
ON (cart.people_id=people.id) WHERE firstname='john';
像使用表一样使用视图来查询.
SELECT lastname FROM shorter_join WHERE id=3;
7.2 使用视图来限制基于条件过滤的数据
hive> CREATE TABLE userinfo (
> firstname string, lastname string, ssn string, password string);
hive> CREATE VIEW safer_user_info AS
> SELECT firstname,lastname FROM userinfo;
hive> CREATE TABLE employee (firstname string, lastname string,
> ssn string, password string, department string);
hive> CREATE VIEW techops_employee AS
> SELECT firstname,lastname,ssn FROM userinfo WERE department='techops';
7.3 动态分区中的视图和map类型
CREATE EXTERNAL TABLE dynamictable(cols map<string,string>)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY '\004'
COLLECTION ITEMS TERMINATED BY '\001'
MAP KEYS TERMINATED BY '\002'
STORED AS TEXTFILE;
CREATE VIEW orders(state, city, part) AS
SELECT cols["state"], cols["city"], cols["part"]
FROM dynamictable
WHERE cols["type"] = "request";
CREATE VIEW shipments(time, part) AS
SELECT cols["time"], cols["parts"]
FROM dynamictable
WHERE cols["type"] = "response";
7.4 视图零零碎碎相关的事情
创建视图时可以使用IF NOT EXISTS
和COMMENT
。如:
CREATE VIEW IF NOT EXISTS shipments(time, part)
COMMENT 'Time and parts for shipments.'
TBLPROPERTIES ('creator' = 'me')
AS SELECT ...;
视图的名称不能和表的名称重名。可以为视图中的新列使用COMMENT
写注释,与原表中的列的注释不同。 在AS SELECT
语句中若没有指定别名默认Hive将使用_CN
作为别名。其中N
从0开始。在AS SELECT
语句之前可以使用TBLPROPERTIES
定义表的属性。 CREATE TABLE … LIKE
结构同样适用于复制视图。只需要在LIKE
关键字后面跟视图名即可。如:
CREATE TABLE clone_shipments
LIKE shipments;
同样可以使用EXTERNAL
和LOCATION
。
删除视图的方式和删除表方式类似
DROP VIEW IF EXISTS shipments;
使用SHOW TABLES(没有SHOW VIEWS)
语句同样可以查看视图。不能使用DROP TABLES
删除视图。
可以使用DESCRIBE
或DESCRIBE EXTENDED
查看视图的元数据信息,使用DESCRIBE EXTENDED
命令的话在输出信息中Detailed Table Information
部分tableType
的值为VIRTUAL_VIEW
。
视图中不能使用INSERT
或LOAD
语句。
视图是只读的,只允许修改元数据TBLPROPERTIES
中的信息。如:
ALTER VIEW shipments SET TBLPROPERTIES ('created_at' = 'some_timestamp');