在Data Lake Analytics中使用視圖
1. 概述
在Data Lake Analytics(以下簡稱DLA)中使用視圖(VIEW)功能,可以大大簡化對于重複SQL,特别是較為複雜的SQL語句的編寫和維護。目前DLA中還不支援SQL視圖的物化。在使用DLA進行跨多個資料源的聯合分析場景中,使用視圖,尤其能夠友善後續對于包含重複SQL片段的SQL查詢語句的編寫和維護。
在介紹視圖的功能之前,需要注意兩個概念:
1)在DLA中,每個SCHEMA(
https://help.aliyun.com/document_detail/72005.html)下的表必須屬于同一類資料源(通過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中可以直接用視圖名進行引用。
2. 建立視圖
文法:
CREATE [OR REPLACE]
VIEW view_name [(column_list)]
AS select_statement
例如:
CREATE OR REPLACE
VIEW `basic_test`.`test_view_1_oss`
AS
SELECT *
FROM nation
ORDER BY n_nationkey
通過CREATE語句建立視圖。如果指定名稱的視圖之前在系統中已經存在,則會報錯提示視圖已經存在。通過CREATE OR REPLACE方式,如果指定名稱的視圖之前在系統中已經存在,則會進行更新,用新的視圖定義替換之前的視圖定義。
3. 查詢視圖中繼資料
視圖中繼資料相關資訊查詢的方式有很多種,下面一一列舉:
- 查詢視圖的建立語句:
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 nation
ORDER 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中不儲存視圖定義的詳細列定義中繼資料資訊。
4. 嵌套視圖
DLA支援視圖的嵌套,即VIEW 1定義指向VIEW 2,VIEW 2定義指向VIEW 3。
CREATE OR REPLACE VIEW view_1 (col1, col2, col3) AS
SELECT *
FROM tpch_test.nation
ORDER BY n_nationkey;
CREATE OR REPLACE VIEW view_2 (col_1, col_2) AS
SELECT col1, col2 FROM view_1 a;
注意:
- 在定義VIEW時,VIEW中指向的SQL語句中,建議對引用的table都加上所屬的schema名,特别是在跨schema的場景下(schema1中的定義view,指向的SQL語句中目标表有其他schema的table或view)。
5. 删除視圖
DROP VIEW [IF EXISTS] view_name