增量物化视图

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

功能介绍

MaxCompute的增量物化视图功能,它具备以下几个特点:

  • 声明式SQL。

  • 增量全量一体化,统一的SQL、存储和计算。

  • 自动增量刷新,自定义数据新鲜度。

  • 通过级联增量物化视图,构建简单易用的增量更新Pipeline。

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

image

前提条件

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

  • Delta Table增量表(详情请参见Delta Table概述),并且需要开启CDC功能。详情请参见建表DDL

  • 增量物化视图。增量物化视图默认已开启CDC功能。

使用限制

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

  • 当前增量物化视图支持的SQL算子包含:PROJECT、FILTER、AGGREGATE、JOIN。其中:

    • AGGREGATE当前仅支持以下常见函数:SUM、COUNT、AVG、MIN、MAX。

    • JOIN当前仅支持不发生变化的维表JOIN。

创建增量物化视图

CREATE MATERIALIZED VIEW [IF NOT EXISTS][<project_name>.]<mv_name>
[LIFECYCLE <days>]    --指定生命周期
[BUILD DEFERRED]    -- 指定是在创建时只生成表结构,不生成数据
[(<col_name> [COMMENT <col_comment>],...)]    --列注释
[DISABLE REWRITE]    --指定是否用于改写
[refresh every 2 minutes]  --指定刷新周期
[COMMENT 'table comment']    --表注释
[PARTITIONED ON/BY (<col_name> [, <col_name>, ...])    --创建物化视图表为分区表
[TBLPROPERTIES(
  "compressionstrategy"="normal/high/extreme",    --指定表数据存储压缩策略
  "enable_auto_refresh"="true",    --指定是否开启自动刷新
  "refresh_mode"="incremental",    --指定刷新模式
  "only_refresh_max_pt"="true",    --针对分区物化视图,只自动刷新源表最新分区
  "refresh_cron"="xx"              --根据cron定时器,可以配置定时间隔更新或者定点更新,间隔定点更新等
              )]
AS <select_statement>;

增量物化视图的语法几乎兼容普通物化视图的语法,目前存在以下差异:

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

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

示例:创建一个简单的增量物化视图。

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;

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

增量刷新模式

相比普通物化视图,您只需要增加以下属性参数,即可指定该物化视图为增量物化视图。

"refresh_mode"="incremental"

目前MaxCompute物化视图支持如下两种刷新模式:

  • full:全量刷新,物化视图的默认刷新方式。

  • incremental:增量刷新。内置增量计算能力,只对增量变化的部分进行计算。

自动刷新频率

增量物化视图提供以下方式来控制刷新频率和数据新鲜度:

  • 通过refresh every xx minutes语法来指定刷新调度间隔,最小值为1分钟。

    refresh every 2 minutes
  • 通过在TBLPROPERTIES中指定cron表达式来设置刷新频率,根据cron定时器,可以配置定时间隔更新、定点更新或间隔定点更新等。其中refresh_cron对应的参数是QUARTZ Cron格式的字符串,使用详情请参见Cron expression examples

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

通常, 指定刷新周期和打开自动刷新("enable_auto_refresh"="true")一起配合使用。

管理和可观测

删除增量物化视图

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 SET TBLPROPERTIES("enable_auto_refresh"="false");

恢复自动刷新

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

ALTER MATERIALIZED VIEW mv SET TBLPROPERTIES("enable_auto_refresh"="true");

修改刷新频率

通过以下命令,可以修改增量物化视图的刷新频率。

ALTER MATERIALIZED VIEW mv 
SET TBLPROPERTIES("enable_auto_refresh"="true", "refresh_interval_minutes"="xx");
说明

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

计费规则

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

  • 计算费用

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

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

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

  • 存储费用

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

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

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