动态物化视图(Delta Live MV)(邀测)

MaxCompute新推出动态物化视图功能(Delta Live Materialized View),帮助用户构建简单易用的增量更新Pipeline。本文为您介绍MaxCompute动态物化视图的相关操作。

功能介绍

动态物化视图相比全量刷新物化视图,能够平衡数据新鲜度和计算代价,充分利用存量的计算结果,通过智能的增量计算算法,减少计算代价,并提高数据新鲜度。

该功能目前处于邀测中,邀测功能使用方法请参见使用说明

整体架构

image

优势

MaxCompute的动态物化视图Delta Live MV功能具备以下优势:

  • 声明式SQL、免运维、自动数仓分层。

  • 简化数仓架构,一份计算逻辑,一个引擎,同时支持增量计算和全量计算,同时满足低延迟和高吞吐需求。

  • 成本效益,平衡数据新鲜度和成本,高效处理增全量ETL。

适用场景

该功能适用于以下场景:

  • 离线业务实时化

    T+1数仓演进到分钟级近实时数仓。

  • 增全量一体

    • 当天分区近实时增量计算:业务数据新鲜度要求高,计算性价比高。

    • (可选操作)历史分区回刷:数据归档、修正,用于后续大规模数据分析。

前提条件

  • 已在MaxCompute控制台创建项目。

  • 源表(source table)已开启CDC功能。目前支持的源表类型如下:

注意事项

  • 动态物化视图不能包含非确定性计算,如RAND函数、UDF等。

  • 当前动态物化视图全面支持各种SQL逻辑的增量计算,包含以下常见的SQL算子:

    • 双流INNER JOIN

    • 双流(LEFT/RIGHT)OUTER JOIN

    • 任意AGGREGATE(除UDAF外),包括无GROUP BY、无AGGFunction。

    • WINDOW

    • TableFunctionScan

    • UNION ALL

    • FILTER/Project

    • SUBQUERY

创建动态物化视图

语法格式

CREATE MATERIALIZED VIEW [IF NOT EXISTS][<project_name>.]<mv_name>
[LIFECYCLE <days>]    --指定生命周期
[BUILD DEFERRED]    -- 指定是在创建时只生成表结构,不生成数据
[(<col_name> [COMMENT <col_comment>],...)]    --列注释
[DISABLE REWRITE]    --指定是否用于改写
[COMMENT <table comment>]    --表注释
[PARTITIONED ON/BY (<col_name> [, <col_name>, ...])    --创建物化视图表为分区表
[REFRESH EVERY <num> MINUTES/HOURS/DAYS] -- 设置物化视图定时更新间隔
TBLPROPERTIES(
  "refresh_mode"="incremental"
  [,"enable_auto_refresh"="true"]    --指定是否开启自动刷新
  [,"refresh_cron"="xx"]             --根据cron定时器,可以配置定时间隔更新或者定点更新,间隔定点更新等
  [,"refresh_job_settings"="xx"]
              )
AS <select_statement>;

动态物化视图Delta Live MV的语法兼容主要普通物化视图的语法,目前存在以下差异:

  • 当前不支持将动态物化视图创建为聚簇表。

  • 动态物化视图不支持将enable_auto_substitute参数设置为true。动态物化视图是异步物化视图形态,所使用的base table数据不一定是最新版本,与enable_auto_substitute设置为true时冲突。

参数说明

参数

是否必填

描述

project_name

项目名称。

mv_name

Delta Live MV名称。

LIFECYCLE <days>

指定生命周期。

BUILD DEFERRED

指定在创建时只生成表结构,不生成数据。

col_name

列名。

col_comment

列注释。

DISABLE REWRITE

指定是否用于改写。

table comment

表注释。

REFRESH EVERY <num> MINUTES/HOURS/DAYS

指定刷新的调度间隔,最小值为1分钟。

enable_auto_refresh

是否开启自动刷新。

  • true:开启。

  • false:不开启。

refresh_mode

刷新模式。

  • full:全量刷新。

  • incremental:增量刷新。

refresh_cron

指定Cron表达式以设置刷新频率,可配置定时间隔更新、定点更新或间隔定点更新等。

取值为QUARTZ Cron格式的字符串,使用详情请参见Cron expression examples。示例如下:

TBLPROPERTIES(
  "enable_auto_refresh"="true",
  "refresh_cron"="xx"
)

refresh_job_settings

设置通用的调优参数,刷新时自动应用。示例如下:

'refresh_job_settings'='set odps.sql.split.size=128;set odps.sql.reshuffle.dynamicpt
=false;'

select_statement

SQL查询语句。

使用示例

示例1:创建简单动态物化视图

定义一个名为mv1的动态物化视图,每5分钟自动进行一次增量刷新。其中source为一张开启CDC功能的Delta Table。

CREATE MATERIALIZED VIEW IF NOT EXISTS mv1
REFRESH EVERY 5 MINUTES
TBLPROPERTIES("enable_auto_refresh"="true", "refresh_mode"="incremental")
AS 
SELECT name, COUNT(*) FROM source GROUP BY name;

示例2:创建含通用调优参数的动态物化视图

CREATE MATERIALIZED VIEW IF NOT EXISTS part_dlmv_department
PRIMARY KEY(dept_id)
LIFECYCLE 10
BUILD DEFERRED
PARTITIONED BY (pt)
TBLPROPERTIES('refresh_mode'='incremental', 
'refresh_job_settings'='set odps.sql.split.size=128;set odps.sql.reshuffle.dynamicpt
=false;')
AS SELECT *, get_setting('odps.custom.setting.department.pt') AS pt FROM t_department;

示例3:创建单分区增量刷新的动态物化视图

创建分区动态物化视图时,需添加BUILD DEFERRED关键字,表示仅执行DDL操作。

-- 创建动态物化视图
CREATE MATERIALIZED VIEW dlmv_pt
PRIMARY KEY(value) BUILD DEFERRED PARTITIONED BY (ds) TBLPROPERTIES
('refresh_mode'='incremental', 'enable_auto_refresh'='true') 
AS SELECT value, AVG(value2), ds FROM dlmv_pt_src GROUP BY value, ds;

-- 刷新单分区
ALTER MATERIALIZED VIEW dlmv_pt REBUILD PARTITION(ds='20250730');
说明

刷新动态物化视图的操作详情,请参见手动刷新

示例4:创建包含参数化定义的动态物化视图

支持参数化定义,可将离线分区作业迁移到增量作业。

  • 支持get_setting函数,用于获取Session Flag中设置的参数值。需要以dps.custom.setting为前缀。

  • 传统离线作业中的${biz_date}替换为get_setting(odps.custom.setting.xx),完成参数化改造。

  • 动态物化视图刷新语句前添加Session Flag set odps.custom.setting.xx=yy

  • 实际运行时,动态物化视图中的get_setting(odps.custom.setting.xx)会被MaxCompute优化器自动替换为yy

示例如下:

-- 创建动态物化视图
CREATE MATERIALIZED VIEW mv1 
BUILD DEFERRED -- 只做ddl,不生成数据
PARTITIONED BY (ds) 
REFRESH EVERY 5 minutes 
TBLPROPERTIES("enable_auto_refresh"="true", "refresh_mode"="incremental")
AS 
SELECT A.* FROM A JOIN B ON A.c1 = B.c1
  AND A.ds=get_setting('odps.custom.setting.bizdate.a')
  AND B.ds=get_setting('odps.custom.setting.bizdate.b');

-- 刷新逻辑,通过Dataworks调度,自动替换${biz_date}和${yesterday}
SET odps.custom.setting.bizdate.a=${biz_date};
SET odps.custom.setting.bizdate.b=${yesterday};
ALTER MATERIALIZED VIEW mv1 REBUILD PARTITION(ds=${biz_date});

管理动态物化视图

删除

DROP MATERIALIZED VIEW [IF EXISTS] [<project_name>.]<mv_name>;

手动刷新

动态物化视图提供手动刷新能力,仅支持刷新单分区。其语法和普通物化视图相同:

ALTER MATERIALIZED VIEW [<project_name>.]<mv_name>
      REBUILD [PARTITION(<ds>=max_pt(<table_name>),<expression1>...)];

其中ds为分区列。

关闭自动刷新

通过如下命令修改物化视图的TBLPROPERTIES参数,以关闭自动刷新功能。

ALTER MATERIALIZED VIEW <mv_name> SET TBLPROPERTIES("enable_auto_refresh"="false");

恢复自动刷新

通过如下命令修改物化视图的TBLPROPERTIES参数,以打开或者恢复自动刷新。

ALTER MATERIALIZED VIEW <mv_name> SET TBLPROPERTIES("enable_auto_refresh"="true");

修改刷新频率

通过如下命令修改动态物化视图的刷新频率。

ALTER MATERIALIZED VIEW <mv_name> 
SET TBLPROPERTIES("refresh_interval_minutes"="xx");
说明

refresh_interval_minutes参数最小取值为1,建议该值小于base tableCDC生命周期。

查看动态物化视图

查看数据变更历史

通过如下命令查看动态物化视图数据的变更记录。

SHOW HISTORY FOR TABLE <mv_name>;

结果示例:

ObjectType      ObjectId                                ObjectName              VERSION(LSN)            Time                    Operation
TABLE           d95ec7015e8b432e8e0092d01da962a9        incremental_mv          0000000000000001        2024-08-18 21:06:32     CREATE
TABLE           d95ec7015e8b432e8e0092d01da962a9        incremental_mv          0000000000000002        2024-08-18 21:11:13     UPDATE

查看刷新记录

通过如下命令查看动态物化视图的刷新记录(仅针对Refresh操作)。

SELECT * FROM 
Delta_Live_MV_Refresh_History(['<project_name>', '<schema_name>',]'<table_name>');

参数说明

参数

描述

project_name

项目名称。

schema_name

Schema名称。

table_name

表名称。

返回值说明

字段名称

描述

project_name

Delta Live MV所属的Project。

schema_name

Delta Live MV所属的Schema。

name

Delta Live MV名称。

refresh_start_time

刷新开始时间。

refresh_end_time

刷新结束时间。任务状态为RUNNING时,该值为NULL。

instance_id

作业ID,通过ID可获取Logview。

duration_in_seconds

刷新耗时。

state

作业状态。

  • RUNNING:运行中。

  • SUCCEEDED:运行成功。

  • FAILED:运行失败。

  • CANCELLED:取消。

refresh_trigger

刷新方式。

  • MANUAL:由用户调用Refresh手动触发刷新,DataWorks调度对于MaxCompute也是手动触发。

  • STSTEM_SCHEDULED:由MaxCompute内部调度刷新。

refresh_mode

刷新模式。

  • FULL:全量刷新。

  • INCREMENTAL:增量刷新。

  • NO_DATA:无增量数据。

error_message

刷新失败的信息。若刷新成功,则该值为NULL。

source_tables

记录了Delta Live MV使用的基表名称以及对应的版本。

numInsertedRows

INSERT行数。

numDeletedRows

DELETE行数。

计费规则

动态物化视图包含计算和存储两部分费用。与普通物化视图操作计算存储计费方式一致。

  • 计算费用

    • 创建或刷新动态物化视图过程中,涉及到实际启动作业计算的,会消耗计算资源产生计算费用,其计费规则和普通SQL作业一致。

    • 触发自动刷新功能时,若无实际增量数据变化,则不会启动SQL作业进行刷新操作,不产生费用。

    • 建议将动态物化视图单独放在某个Project中,方便跟踪自动刷新的作业及其计算资源消耗和费用。

  • 存储费用

    • 动态物化视图和普通物化视图或者普通表一样,按照正常存储计量计费。

    • 动态物化视图对某些operator可能会采取基于state的增量计算算法,会产生内部state table消耗一定的存储空间。

    • 动态物化视图需要增量CDC、Time Travel存储开销,这部分存储开销和普通Delta Table类似。