在 Data Lake Analytics 中使用视图
概述
在 Data Lake Analytics(以下简称 DLA)中使用视图(VIEW)功能,可以大大简化对于重复 SQL,特别是较为复杂的 SQL 语句的编写和维护。目前 DLA 中还不支持 SQL 视图的物化。在使用 DLA 进行跨多个数据源的联合分析场景中,使用视图,尤其能够方便后续对于包含重复 SQL 片段的 SQL 查询语句的编写和维护。
在介绍视图的功能之前,需要注意两个概念:1)在 DLA 中,每个 SCHEMA(https://help.aliyun.com/docum…)下的表必须属于同一类数据源(通过 CATALOG 属性指定),也必须属于同一个 LOCATION 约束的数据源。
对于 OSS,SCHEMA 中 LOCATION 指向一个目录,后续在该 SCHEMA 下的表所指向的 LOCATION 必须从属于该 SCHEMA 的 LOCATION 目录;对于其他实例型数据源(比如 Table Store、RDS 等),SCHEMA 中 LOCATION 指向一个实例 URL,后续在该 SCHEMA 下的表必须也属于该实例。2)和表类似,视图必须属于一个 SCHEMA,在 SQL 中引用视图时,可以通过“schema_name.view_name”来进行引用,如果当前数据库连接的 schema 是视图所属的 SCHEMA 时,在 SQL 中可以直接用视图名进行引用。
创建视图
语法:
CREATE [OR REPLACE]VIEW view_name [(column_list)]AS select_statement 例如:
CREATE OR REPLACEVIEW basic_test.test_view_1_ossASSELECT *FROM nationORDER BY n_nationkey 通过 CREATE 语句创建视图。如果指定名称的视图之前在系统中已经存在,则会报错提示视图已经存在。通过 CREATE OR REPLACE 方式,如果指定名称的视图之前在系统中已经存在,则会进行更新,用新的视图定义替换之前的视图定义。
查询视图元数据
视图元数据相关信息查询的方式有很多种,下面一一列举:
查询视图的创建语句:语法:
SHOW CREATE (TABLE | VIEW) view_name 例如:
SHOW CREATE VIEW basic_test.test_view_1_oss;
View
Create View
character_set_client
collation_connection
test_view_1_oss
CREATE VIEW basic_test.test_view_1_oss AS SELECT *
FROM nation
ORDER BY n_nationkey
utf8
utf8_general_ci
查询 information_schema.views 元数据:SELECT * FROM information_schema.views WHERE table_schema = ‘basic_test’;
TABLE_CATALOG
TABLE_SCHEMA
TABLE_NAME
VIEW_DEFINITION
CHECK_OPTION
IS_UPDATABLE
DEFINER
SECURITY_TYPE
CHARACTER_SET_CLIENT
COLLATION_CONNECTION
def
basic_test
test_view_1_oss
SELECT *
FROM nationORDER BY n_nationkey | NONE | YES | mysql.sys@localhost | INVOKER | utf8 | utf8_general_ci || def | basic_test | test_view_2_oss | SELECT *
FROM nation
NONE
YES
mysql.sys@localhost
INVOKER
utf8
utf8_general_ci
目前,DLA 中不保存视图定义的详细列定义元数据信息。
嵌套视图
DLA 支持视图的嵌套,即 VIEW 1 定义指向 VIEW 2,VIEW 2 定义指向 VIEW 3。
例如:
CREATE OR REPLACE VIEW view_1 (col1, col2, col3) ASSELECT *FROM tpch_test.nationORDER BY n_nationkey;
CREATE OR REPLACE VIEW view_2 (col_1, col_2) ASSELECT col1, col2 FROM view_1 a; 注意:
在定义 VIEW 时,VIEW 中指向的 SQL 语句中,建议对引用的 table 都加上所属的 schema 名,特别是在跨 schema 的场景下(schema1 中的定义 view,指向的 SQL 语句中目标表有其他 schema 的 table 或 view)。
删除视图
语法:
DROP VIEW [IF EXISTS] view_name
本文作者:julian.zhou
阅读原文
本文为云栖社区原创内容,未经允许不得转载。