MaxCompute は、シンプルで使いやすい増分更新パイプラインの構築に役立つ Delta Live マテリアライズドビュー (Delta Live MV) 機能を導入しています。このトピックでは、MaxCompute Delta Live MV で実行できる操作について説明します。
はじめに
完全更新を使用するマテリアライズドビューと比較して、Delta Live MV はデータ鮮度とコンピューティングコストのバランスを取ります。既存のコンピューティング結果を活用し、インテリジェントな増分計算アルゴリズムを使用してコンピューティングコストを削減し、データ鮮度を向上させます。
この機能は現在、招待プレビュー段階です。詳細については、「手順」をご参照ください。
アーキテクチャ

利点
MaxCompute の Delta Live MV 機能には、次の利点があります。
宣言型 SQL、ゼロメンテナンス、および自動データウェアハウス階層化。
簡素化されたデータウェアハウスアーキテクチャ。単一のコンピューティングロジックセットと 1 つのエンジンで増分計算と完全計算の両方をサポートし、低レイテンシーと高スループットの両方の要件を満たします。
費用対効果が高い。Delta Live MV はデータ鮮度とコストのバランスを取り、増分および完全な ETL (抽出·変換·書き出し) プロセスを効率的に処理します。
シナリオ
この機能は、次のシナリオに適しています。
オフラインサービスのリアルタイム化
T+1 データウェアハウスから、分レベルのニアリアルタイムデータウェアハウスに進化します。
増分計算と完全計算の統合
当日パーティションのニアリアルタイム増分計算: これは、高いデータ鮮度と費用対効果の高いコンピューティングを必要とするシナリオに適しています。
(オプション) 履歴パーティションの更新: これは、データアーカイブ、データ修正、およびその後の大規模なデータ分析に使用されます。
前提条件
MaxCompute コンソールでプロジェクトが作成されていること。
ソーステーブルで Change Data Capture (CDC) 機能が有効になっていること。次のタイプのソーステーブルがサポートされています。
CDC 機能が有効になっているDelta テーブル。
Delta Live MV テーブル。Delta Live MV では、CDC 機能はデフォルトで有効になっています。
注意事項
Delta Live MV には、RAND 関数やユーザー定義関数 (UDF) などの非決定的な計算を含めることはできません。
Delta Live MV は現在、さまざまな SQL 操作の増分計算をサポートしており、これには次の一般的な SQL オペレーターが含まれます。
2 つのストリームに対する INNER JOIN
2 つのストリームに対する LEFT/RIGHT OUTER JOIN
ユーザー定義集計関数 (UDAF) を除く集計関数。これには、GROUP BY または AGG のない関数が含まれます。
WINDOW
TableFunctionScan
UNION ALL
FILTER/Project
SUBQUERY
Delta Live MV の作成
構文
CREATE MATERIALIZED VIEW [IF NOT EXISTS][<project_name>.]<mv_name>
[LIFECYCLE <days>] -- ライフサイクルを指定します。
[BUILD DEFERRED] -- テーブルスキーマのみを作成し、データは生成しないことを指定します。
[(<col_name> [COMMENT <col_comment>],...)] -- 列のコメント。
[DISABLE REWRITE] -- MV をクエリの再書き込みに使用するかどうかを指定します。
[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 の構文は、標準のマテリアライズドビューの構文と互換性がありますが、次の点が異なります。
Delta Live MV をクラスター化テーブルとして作成することはできません。
Delta Live MV では、
enable_auto_substituteパラメーターを true に設定することはできません。Delta Live MV は非同期マテリアライズドビューであり、そのベーステーブルのデータは最新バージョンではない可能性があります。この動作は、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 | いいえ | 自動更新を有効にするかどうかを指定します。
|
refresh_mode | いいえ | 更新モード。
|
refresh_cron | いいえ | cron 式を指定して更新頻度を設定します。スケジュールされた間隔の更新、固定時間の更新、またはその組み合わせを設定できます。 値は QUARTZ Cron フォーマットの文字列です。詳細については、「Cron 式の例」をご参照ください。例: |
refresh_job_settings | いいえ | 更新中に自動的に適用される一般的なチューニングパラメーターを設定します。例: |
select_statement | はい | SQL 検索文。 |
例
例 1: シンプルな Delta Live MV の作成
この例では、5 分ごとに自動的に増分更新を実行する mv1 という名前の Delta Live MV を作成します。ソーステーブルは、CDC 機能が有効になっている Delta テーブルです。
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: 一般的なチューニングパラメーターを使用した Delta Live MV の作成
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: 単一パーティションの増分更新をサポートする Delta Live MV の作成
パーティション化された Delta Live MV を作成するときは、BUILD DEFERRED キーワードを追加して、データ定義言語 (DDL) 操作のみが実行されるように指定します。
-- Delta Live MV を作成します。
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');Delta Live MV の更新方法の詳細については、「手動更新」をご参照ください。
例 4: パラメーター化された定義を持つ Delta Live MV の作成
パラメーター化された定義がサポートされています。オフラインのパーティション化されたジョブを増分ジョブに移行できます。
get_setting 関数がサポートされています。この関数は、セッションフラグで設定されたパラメーターの値を取得します。パラメーターにはプレフィックス
dps.custom.settingを付ける必要があります。従来のオフラインジョブでは、
${biz_date}をget_setting(odps.custom.setting.xx)に置き換えてパラメーター化を実装します。Delta Live MV の更新文の前に、セッションフラグ
set odps.custom.setting.xx=yyを追加します。実行時に、Delta Live MV の
get_setting(odps.custom.setting.xx)は、MaxCompute オプティマイザーによって自動的にyyに置き換えられます。
例:
-- Delta Live MV を作成します。
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>;手動更新
Delta Live MV は、単一パーティションの手動更新のみをサポートします。構文は、標準のマテリアライズドビューと同じです。
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");更新頻度の変更
次のコマンドを使用して、Delta Live MV の更新頻度を変更できます。
ALTER MATERIALIZED VIEW <mv_name>
SET TBLPROPERTIES("refresh_interval_minutes"="xx");refresh_interval_minutes パラメーターの最小値は 1 です。この値は、ベーステーブルの CDC ライフサイクルよりも小さくする必要があります。
動的マテリアライズドビューの表示
データ変更履歴の表示
次のコマンドを実行して、Delta Live MV のデータ変更レコードを表示します。
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更新履歴の表示
次のコマンドを実行して、Delta Live MV の更新履歴を表示します。このコマンドは、更新操作にのみ適用されます。
SELECT * FROM
Delta_Live_MV_Refresh_History(['<project_name>', '<schema_name>',]'<table_name>');パラメーター
パラメーター | 説明 |
project_name | プロジェクト名。 |
schema_name | スキーマ名。 |
table_name | テーブル名。 |
戻り値
フィールド | 説明 |
project_name | Delta Live MV が属するプロジェクト。 |
schema_name | Delta Live MV が属するスキーマ。 |
name | Delta Live MV の名前。 |
refresh_start_time | 更新が開始された時刻。 |
refresh_end_time | 更新が終了した時刻。タスクのステータスが RUNNING の場合、この値は NULL です。 |
instance_id | ジョブ ID。この ID を使用して Logview を取得できます。 |
duration_in_seconds | 更新の完了にかかった時間。 |
state | ジョブのステータス。
|
refresh_trigger | 更新メソッド。
|
refresh_mode | 更新モード。
|
error_message | 更新が失敗した場合のエラーメッセージ。更新が成功した場合、この値は NULL です。 |
source_tables | Delta Live MV で使用されるベーステーブルの名前と、それに対応するバージョンを記録します。 |
numInsertedRows | 挿入された行数。 |
numDeletedRows | 削除された行数。 |
課金ルール
Delta Live MV のコストは、コンピューティングコストとストレージコストで構成されます。コンピューティングとストレージの課金方法は、標準のマテリアライズドビュー操作と同じです。
コンピューティング料金
Delta Live MV を作成または更新する際に、コンピューティングジョブが開始されると、コンピューティングリソースが消費され、コンピューティング料金が発生します。課金ルールは、標準の SQL ジョブと同じです。
自動更新機能がトリガーされたときに、増分データの変更がない場合、更新のための SQL ジョブは開始されず、料金は発生しません。
Delta Live MV は別のプロジェクトに配置することをお勧めします。これにより、自動更新ジョブ、そのコンピューティングリソースの消費、および関連する料金を追跡しやすくなります。
ストレージ料金
Delta Live MV は、標準のマテリアライズドビューまたは標準テーブルと同じ方法でストレージ料金が課金されます。
一部のオペレーターでは、Delta Live MV は状態ベースの増分計算アルゴリズムを使用する場合があります。これにより、ストレージ領域を消費する内部状態テーブルが生成されます。
Delta Live MV は、増分 CDC と Time Travel のためにストレージオーバーヘッドを必要とします。このストレージオーバーヘッドは、標準の Delta テーブルのそれと似ています。