CREATE VIEW
描述
视图基于 SQL
查询或是 Java
、 Scala
、Python
代码的结果集。
创建视图 CREATE VIEW
会构建一个没有物理数据的虚拟表,因此其他操作(如更改视图 ALTER VIEW
和删除视图 DROP VIEW
)只能更改元数据。
语法
CREATE [ OR REPLACE ] [ [ GLOBAL ] TEMPORARY ] VIEW [ IF NOT EXISTS ] view_identifier
create_view_clauses AS ( query | code )
参数
OR REPLACE
如果指定,视图的资源将被重新加载。这主要用于获取对视图实现所做的任何更改。
该参数与IF NOT EXISTS
相互排斥,不能同时指定。[ GLOBAL ] TEMPORARY
临时(TEMPORARY)视图是会话作用域视图,会话结束时会被丢弃,因为它会跳过在底层元存储中持久化定义(如果有的话)。
全局临时(GLOBAL TEMPORARY)视图与系统保存的临时数据库global_temp
绑定。
此参数与IF NOT EXISTS
相互排斥,不能同时指定。IF NOT EXISTS
如果指定,则仅在视图不存在时创建该视图。如果系统中已存在指定视图,则视图创建成功(不出错)。
此参数与OR REPLACE
和TEMPORARY
相互排斥,不能同时指定。view_identifier
指定要创建的视图名称。视图名称可选择使用数据库名称限定。
语法:
[ database_name. ] view_name
create_view_clauses
这些分句是可选的,对顺序不敏感。格式如下:
[ ( column_name [ COMMENT column_comment ], ... ) ]
用来指定列级的注释。[ COMMENT view_comment ]
用来指定视图的注释。[ TBLPROPERTIES ( property_name = property_value [ , ... ] ) ]
用来添加元数据的键值对.[ LANGUAGE JAVA | SCALA | PYTHON ]
用来指定视图创建的语言,如果指定了语言则后面需要填写code
而不是query
。
query
A SELECT statement that constructs the view from base tables or other views.code
指定要创建的视图的代码。该代码应是一个有效的Java
、Scala
或Python
视图定义。最后应当返回一个DataFrame
。
示例
-- 创建或替换带有注释的视图 `experienced_employee`。
CREATE OR REPLACE VIEW experienced_employee
(ID COMMENT 'Unique identification number', Name)
COMMENT 'View for experienced employees'
AS SELECT id, name FROM all_employee
WHERE working_years > 5;
-- 在视图不存在时创建一个全局临时视图 `experienced_employee_global`。
CREATE GLOBAL TEMPORARY VIEW experienced_employee_global
IF NOT EXISTS
AS SELECT id, name FROM all_employee WHERE working_years > 5;
-- 使用Java创建视图 `experienced_employee_java` 。
CREATE VIEW experienced_employee_java
LANGUAGE JAVA
AS $$ return spark.sql("SELECT id, name FROM all_employee WHERE working_years > 2"); $$;
-- 使用Scala创建视图 `experienced_employee_scala`。
-- `your_specific_func` 是一个自主编写的函数,其中的逻辑可以自主定义。
CREATE VIEW experienced_employee_scala
LANGUAGE SCALA
AS $$
def your_specific_func(): Int = {
/*
your code here
*/
}
val x = your_specific_func()
spark.sql($"SELECT id, name FROM all_employee WHERE working_years > $x")
$$;
-- 使用Python创建视图 `experienced_employee_java`,Python代码最后需要return一个DataFrame
CREATE VIEW experienced_employee_python LANGUAGE PYTHON AS $$
def your_specific_func():
/* return a value */
x = your_specific_func()
return spark.sql(f"SELECT id, name FROM all_employee WHERE working_years > {x}")
$$;
相关语句
TODO
- language java集群上无法parse
- showviews在getSqlTypeFromLogicalPlan里没有