CREATE MATERIALIZED VIEW
描述
物化视图基于 SQL
查询或是 Java
、 Scala
、Python
代码的结果集,可以像表一样查询,但查询结果/中间结果会被缓存。
语法
CREATE [ OR REPLACE ] [ [ GLOBAL ] TEMPORARY ] MATERIALIZED 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. ] function_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 MATERIALIZED 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 MATERIALIZED VIEW experienced_employee_global
IF NOT EXISTS
AS SELECT id, name FROM all_employee WHERE working_years > 5;
-- 使用Java创建物化视图 `experienced_employee_java` 。
CREATE MATERIALIZED 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 MATERIALIZED VIEW experienced_employee_scala
LANGUAGE SCALA
AS $$
def your_specific_func(): Int = {
/*
your code here
*/
}
val x = your_specific_func()
spark.sql(s"SELECT id, name FROM all_employee WHERE working_years > $x")
$$;
-- 使用Python创建物化视图 `experienced_employee_python`,Python代码最后需要return一个DataFrame
-- `your_specific_func` 是一个自主编写的函数,其中的逻辑可以自主定义。
CREATE MATERIALIZED 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}")
$$;
注意
- 并非所有查询都可以创建物化视图。例如,包含以下几种情况的查询会被退化为普通视图:
- 包含aggregate(distinct(col))的查询。
- 超过1个的distinct聚合。
- 同表的join。
- TODO 待补充