本文為您介紹物化視圖定時更新功能和相關操作。
使用說明
物化視圖定時更新本質上是系統後台提交了一個任務,完成時間和當前叢集資源、任務大小有關。
當前定時更新是全量重新整理模式,即:
當分區物化視圖中分區列對應的分區基表的某個分區資料發生變化時,只會重新整理物化視圖中相應的分區,其他分區不受影響;當分區物化視圖中被關聯的其它表發生變化時,會重新整理整個物化視圖。
對於非分區物化視圖,會自動檢查本次更新是否有必要,即假如涉及的源表沒有發生變化,則會跳過此次更新。
如果某次重新整理所用的時間超過自動重新整理指定的間隔,會自動跳過超過的時間點,等到下次最近的時間點再重新整理。
例如,定時重新整理時間間隔設定為20分鐘,第一次重新整理時間是
10:00:00
時,那麼按照重新整理時間間隔,理論上第二次重新整理時間是10:20:00
,第三次重新整理時間是10:40:00
。如果
10:00:00
開始第一次重新整理後,一直到10:30:00
重新整理才結束,那麼10:20:00
的重新整理會被跳過,直到10:40:00
再開始重新整理。當前MaxCompute無法即時感知到設定了定時更新的物化視圖,有一定延時(30分鐘以內)。
開啟物化視圖定時更新功能
MaxCompute提供了三種設定物化視圖定時重新整理資料的方式。
本文樣本建立物化視圖都是基於mf_refresh表。
CREATE TABLE mf_refresh (id bigint, name string);
INSERT INTO TABLE mf_refresh VALUES (1,'kyle'),(2,'tom');
通過EVERY參數設定
建立物化視圖時指定更新頻率,每N分鐘/小時/天更新一次。下一次更新時間點為上次更新資料時間點加N分鐘/小時/天。
文法命令
CREATE MATERIALIZED VIEW [IF NOT EXISTS] [project_name.]mv_name [LIFECYCLE days] -- 指定生命週期 [(col_name [COMMENT col_comment], ...)] -- 列注釋 [DISABLE REWRITE] -- 指定是否用於改寫 [PARTITIONED BY (col_name [, col_name, ...]) -- 建立物化視圖表為分區表 [CLUSTERED BY|RANGE CLUSTERED BY (col_name [, col_name, ...]) [SORTED BY (col_name [ASC | DESC] [, col_name [ASC | DESC] ...])] INTO number_of_buckets BUCKETS]--用於建立聚簇表時設定表的Shuffle和Sort屬性 [REFRESH EVERY xx MINUTES/HOURS/DAYS] -- 設定物化視圖定時更新間隔 TBLPROPERTIES("enable_auto_refresh"="true") -- 開啟自動更新 AS <select_statement>;
使用樣本
建立一個每10分鐘更新一次的物化視圖。
建立物化視圖mf_mv_refresh,並進行查詢。
CREATE MATERIALIZED VIEW IF NOT EXISTS mf_mv_refresh REFRESH EVERY 10 minutes TBLPROPERTIES("enable_auto_refresh"="true") AS SELECT id,name FROM mf_refresh; SELECT * FROM mf_mv_refresh;
返回結果如下。
+------------+------------+ | id | name | +------------+------------+ | 1 | kyle | | 2 | tom | +------------+------------+
再次插入資料。
INSERT INTO TABLE mf_refresh VALUES (3,'jen'),(4,'cathy');
十分鐘後查詢檢視。
SELECT * FROM mf_mv_refresh;
返回結果如下。
+------------+------------+ | id | name | +------------+------------+ | 1 | kyle | | 2 | tom | | 3 | jen | | 4 | cathy | +------------+------------+
通過TBLPROPERTIES屬性的refresh_interval_minutes
參數設定
建立物化視圖時指定更新頻率,每N分鐘更新一次。下一次更新時間點為上次更新資料時間點加N分鐘。
文法命令
CREATE MATERIALIZED VIEW [IF NOT EXISTS] [project_name.]mv_name [LIFECYCLE days] -- 指定生命週期 [(col_name [COMMENT col_comment], ...)] -- 列注釋 [DISABLE REWRITE] -- 指定是否用於改寫 [PARTITIONED BY (col_name [, col_name, ...]) -- 建立物化視圖表為分區表 [CLUSTERED BY|RANGE CLUSTERED BY (col_name [, col_name, ...]) [SORTED BY (col_name [ASC | DESC] [, col_name [ASC | DESC] ...])] INTO number_of_buckets BUCKETS]--用於建立聚簇表時設定表的Shuffle和Sort屬性 TBLPROPERTIES("enable_auto_refresh"="true", "refresh_interval_minutes"="xx") -- 開啟定時更新 AS <select_statement>;
使用樣本
建立一個每20分鐘更新一次的物化視圖。
建立物化視圖mf_mv_refresh2,並進行查詢。
CREATE MATERIALIZED VIEW IF NOT EXISTS mf_mv_refresh2 TBLPROPERTIES("enable_auto_refresh"="true", "refresh_interval_minutes"="20") AS SELECT id,name FROM mf_refresh; SELECT * FROM mf_mv_refresh2;
返回結果如下。
+------------+------------+ | id | name | +------------+------------+ | 1 | kyle | | 2 | tom | | 3 | jen | | 4 | cathy | +------------+------------+
再次向表中插入資料。
INSERT INTO TABLE mf_refresh VALUES (5,'roger'),(6,'david');
20分鐘後查詢檢視。
SELECT * FROM mf_mv_refresh2;
返回結果如下。
+------------+------------+ | id | name | +------------+------------+ | 1 | kyle | | 2 | tom | | 3 | jen | | 4 | cathy | | 5 | roger | | 6 | david | +------------+------------+
通過TBLPROPERTIES屬性的refresh_cron
參數設定
根據cron定時器,可以配置定時間隔更新或者定點更新,間隔定點更新等。
文法命令
CREATE MATERIALIZED VIEW [IF NOT EXISTS] [project_name.]mv_name [LIFECYCLE days] -- 指定生命週期 [(col_name [COMMENT col_comment], ...)] -- 列注釋 [DISABLE REWRITE] -- 指定是否用於改寫 [PARTITIONED BY (col_name [, col_name, ...]) -- 建立物化視圖表為分區表 [CLUSTERED BY|RANGE CLUSTERED BY (col_name [, col_name, ...]) [SORTED BY (col_name [ASC | DESC] [, col_name [ASC | DESC] ...])] INTO number_of_buckets BUCKETS]--用於建立聚簇表時設定表的Shuffle和Sort屬性 TBLPROPERTIES("enable_auto_refresh"="true", "refresh_cron"="xx") -- 開啟定時更新 AS <select_statement>;
其中
refresh_cron
對應的參數是QUARTZ Cron格式的字串,使用詳情請參見Cron expression examples。使用樣本
建立一個每5分鐘更新一次的物化視圖。
建立物化視圖mf_mv_refresh3,並進行查詢。
CREATE MATERIALIZED VIEW IF NOT EXISTS mf_mv_refresh3 TBLPROPERTIES("enable_auto_refresh"="true", "refresh_cron"="* */5 * * * ? *") AS SELECT id,name FROM mf_refresh; SELECT * FROM mf_mv_refresh3;
返回結果如下。
+------------+------------+ | id | name | +------------+------------+ | 1 | kyle | | 2 | tom | | 3 | jen | | 4 | cathy | | 5 | roger | | 6 | david | +------------+------------+
再次插入資料。
INSERT INTO TABLE mf_refresh VALUES (7,'ethan'),(8,'cal');
5分鐘後查詢檢視。
SELECT * FROM mf_mv_refresh3;
返回結果如下。
+------------+------------+ | id | name | +------------+------------+ | 1 | kyle | | 2 | tom | | 7 | ethan | | 8 | cal | | 3 | jen | | 4 | cathy | | 5 | roger | | 6 | david | +------------+------------+
建立一個每天晚上8點更新一次的物化視圖。
建立物化視圖mf_mv_refresh4,並進行查詢。
CREATE MATERIALIZED VIEW IF NOT EXISTS mf_mv_refresh4 TBLPROPERTIES("enable_auto_refresh"="true","refresh_cron"="0 0 20 * * ? *") AS SELECT id,name FROM mf_refresh; SELECT * FROM mf_mv_refresh4;
返回結果如下。
+------------+------------+ | id | name | +------------+------------+ | 1 | kyle | | 2 | tom | | 7 | ethan | | 8 | cal | | 3 | jen | | 4 | cathy | | 5 | roger | | 6 | david | +------------+------------+
再次插入資料。
INSERT INTO TABLE mf_refresh VALUES (9,'annie'),(10,'zoe');
在
20:00
後,查詢檢視。SELECT * FROM mf_mv_refresh4;
返回結果如下。
+------------+------------+ | id | name | +------------+------------+ | 1 | kyle | | 2 | tom | | 9 | annie | | 10 | zoe | | 7 | ethan | | 8 | cal | | 3 | jen | | 4 | cathy | | 5 | roger | | 6 | david | +------------+------------+
更新物化視圖重新整理時間
可以使用如下命令對已存在的物化視圖設定定時更新。
ALTER MATERIALIZED VIEW mf_mv_refresh2 SET TBLPROPERTIES("enable_auto_refresh"="true", "refresh_interval_minutes"="xx");
ALTER MATERIALIZED VIEW mf_mv_refresh3 SET TBLPROPERTIES("enable_auto_refresh"="true", "refresh_cron"="xx");
關閉定時重新整理功能
可以使用如下命令關閉物化視圖定時更新功能。
ALTER MATERIALIZED VIEW mf_mv_refresh SET TBLPROPERTIES("enable_auto_refresh"="false");
查看物化視圖更新歷史
可以使用如下命令查看物化視圖更新歷史。
DESC EXTENDED mf_mv_refresh;
返回結果,請參見查詢物化視圖資訊。