Tampilan yang di-materialisasi Delta Live (Delta Live MV) memungkinkan Anda membangun pipeline pembaruan inkremental yang sederhana. Topik ini menjelaskan cara menggunakan Delta Live MV di MaxCompute.
Ikhtisar
Dibandingkan dengan tampilan yang di-materialisasi yang memerlukan pembaruan penuh, Delta Live MV menyeimbangkan kesegaran data dan biaya komputasi. Fitur ini secara cerdas menggunakan kembali hasil komputasi yang telah ada dan menerapkan algoritma komputasi inkremental untuk mengurangi biaya komputasi serta meningkatkan kesegaran data.
Arsitektur

Keunggulan utama
Delta Live MV MaxCompute menyediakan keunggulan berikut:
Memungkinkan pelapisan gudang data melalui proses deklaratif, sepenuhnya dikelola, dan otomatis.
Arsitektur gudang data yang disederhanakan: satu set logika komputasi dan satu mesin mendukung komputasi inkremental maupun penuh, memenuhi kebutuhan latensi rendah dan throughput tinggi.
Hemat biaya: menyeimbangkan kesegaran data dan biaya komputasi, serta menangani pemrosesan inkremental dan penuh secara terpadu secara efisien.
Kasus penggunaan
Fitur Delta Live MV cocok untuk kasus penggunaan berikut:
Gudang data near-real-time
Memungkinkan evolusi dari gudang data T+1 menjadi gudang data near-real-time dengan latensi tingkat menit.
Pemrosesan inkremental dan penuh terpadu
Komputasi inkremental near-real-time pada partisi hari ini untuk kesegaran data tinggi dan efisiensi biaya.
(Opsional) Backfill partisi historis untuk pengarsipan data, koreksi, dan analisis data skala besar.
Dukungan komprehensif untuk komputasi inkremental dengan berbagai konstruksi SQL, termasuk operator SQL umum berikut:
INNER JOIN dua aliran
LEFT/RIGHT OUTER JOIN dua aliran
Semua fungsi AGGREGATE (kecuali UDAF), termasuk yang tidak memiliki GROUP BY atau AGG.
WINDOW
TableFunctionScan
UNION ALL
FILTER/Project
SUBQUERY
Prasyarat
Anda memiliki proyek MaxCompute.
Tabel sumber harus memiliki Change Data Capture (CDC) yang diaktifkan. Jenis tabel sumber berikut didukung:
Delta Table dengan fitur CDC yang diaktifkan secara eksplisit.
Delta Live MV lain. CDC diaktifkan secara default untuk Delta Live MV.
Delta Live MV tidak boleh mengandung komputasi non-deterministik, seperti fungsi RAND atau UDF.
Buat Delta Live MV
Sintaks
CREATE MATERIALIZED VIEW [IF NOT EXISTS][<project_name>.]<mv_name>
[LIFECYCLE <days>] --Tentukan siklus hidup.
[BUILD DEFERRED] --Buat hanya skema tabel tanpa mengisi data.
[(<col_name> [COMMENT <col_comment>],...)] --Komentar kolom.
[DISABLE REWRITE] --Nonaktifkan penulisan ulang kueri untuk tampilan ini.
[COMMENT <table comment>] --Komentar tabel.
[PARTITIONED ON/BY (<col_name> [, <col_name>, ...]) --Buat tampilan yang di-materialisasi sebagai tabel partisi.
[REFRESH EVERY <num> MINUTES/HOURS/DAYS] --Atur interval penyegaran terjadwal untuk tampilan yang di-materialisasi.
TBLPROPERTIES(
"refresh_mode"="incremental"
[,"enable_auto_refresh"="true"] --Tentukan apakah akan mengaktifkan penyegaran otomatis.
[,"refresh_cron"="xx"] --Konfigurasikan interval terjadwal, titik waktu tertentu, atau kombinasi penyegaran menggunakan ekspresi cron.
[,"refresh_job_settings"="xx"]
)
AS <select_statement>;Sintaks Delta Live MV kompatibel dengan sintaks tampilan yang di-materialisasi standar, dengan perbedaan berikut:
Delta Live MV tidak dapat dibuat sebagai tabel terkluster.
Parameter
enable_auto_substitutetidak dapat diatur ke true untuk Delta Live MV. Delta Live MV adalah tampilan yang di-materialisasi asinkron, sehingga data dari tabel dasar mungkin bukan versi terbaru. Hal ini bertentangan dengan perilaku saatenable_auto_substitutediatur ke true.
Parameter
Parameter | Wajib | Deskripsi |
project_name | Tidak | Nama proyek. |
mv_name | Ya | Nama Delta Live MV. |
LIFECYCLE <days> | Tidak | Siklus hidup data dalam hari. |
BUILD DEFERRED | Tidak | Membuat skema tabel tanpa menghasilkan data. |
col_name | Tidak | Nama kolom. |
col_comment | Tidak | Komentar kolom. |
DISABLE REWRITE | Tidak | Menonaktifkan penulisan ulang kueri untuk tampilan. |
table comment | Tidak | Komentar tabel. |
REFRESH EVERY <num> MINUTES/HOURS/DAYS | Tidak | Menentukan interval penyegaran terjadwal. Nilai minimum adalah 1 menit. |
enable_auto_refresh | Tidak | Menentukan apakah akan mengaktifkan penyegaran otomatis.
|
refresh_mode | Tidak | Mode penyegaran.
|
refresh_cron | Tidak | Ekspresi Cron QUARTZ untuk mengatur frekuensi penyegaran. Anda dapat mengonfigurasi jadwal penyegaran berbasis interval, titik waktu tertentu, atau kombinasi keduanya. Nilainya berupa string dalam format Cron QUARTZ. Untuk informasi selengkapnya, lihat Contoh ekspresi cron. Berikut contohnya: |
refresh_job_settings | Tidak |
|
select_statement | Ya | Pernyataan kueri SQL. |
Contoh
Contoh 1: Buat Delta Live MV sederhana
Definisikan Delta Live MV bernama mv1 yang melakukan penyegaran inkremental secara otomatis setiap 5 menit. Tabel sumber adalah Delta Table dengan CDC yang diaktifkan.
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;Contoh 2: Buat tampilan dengan parameter tuning
SET odps.task.major.version=sql_flighting_dlmv;
CREATE MATERIALIZED VIEW IF NOT EXISTS part_dlmv_department
PRIMARY KEY(dept_id) -- Kunci primer dapat disimpulkan dari logika SQL. Namun, karena MV partisi hanya mendukung mode BUILD DEFERRED yang memerlukan deklarasi kunci primer eksplisit, Anda harus mendeklarasikannya di sini.
LIFECYCLE 10
BUILD DEFERRED
PARTITIONED BY (pt)
TBLPROPERTIES('refresh_mode'='incremental',
'refresh_job_settings'='set odps.task.major.version=sql_flighting_dlmv;')
AS
SELECT *, get_setting('odps.custom.setting.department.pt') AS pt FROM t_department; Persyaratan kunci primer untuk penyegaran MV:
Agar mendukung penyegaran, Delta Live MV harus memiliki kunci primer (PK). Apakah Anda harus mendeklarasikan PK secara eksplisit bergantung pada situasinya:
Ketika kunci primer dapat disimpulkan secara otomatis dari logika SQL
Misalnya, jika SQL berisi klausa GROUP BY key, kunci primer MV secara otomatis disimpulkan sebagai key, dan Anda tidak perlu mendeklarasikannya secara eksplisit. Anda dapat melihat kolom kunci primer yang disimpulkan dengan menjalankan perintah
DESC EXTENDED mvName;.Ketika kunci primer tidak dapat disimpulkan secara otomatis dari logika SQL
Metode 1: Ubah logika SQL MV dengan menambahkan klausa GROUP BY untuk memenuhi kondisi inferensi otomatis.
Metode 2: Deklarasikan kunci primer secara eksplisit. Data itu sendiri harus memenuhi batasan unik. Sistem mencoba memverifikasi keunikan data untuk setiap penyegaran inkremental. Pemeriksaan keunikan untuk pemuatan data awal sedang dioptimalkan dan akan tersedia di rilis mendatang.
Persyaratan khusus untuk MV partisi
MV partisi saat ini hanya mendukung mode BUILD DEFERRED, yang tidak mendukung inferensi kunci primer otomatis. Oleh karena itu, Anda harus mendeklarasikan kunci primer secara eksplisit.
Delta Live MV Dipartisi
Skenario 1: Gunakan Delta Live MV partisi untuk merepresentasikan data inkremental hari ini dan data penuh untuk catatan historis.
SET odps.task.major.version=sql_flighting_dlmv;
CREATE MATERIALIZED VIEW IF NOT EXISTS part_dlmv_department
PRIMARY KEY(dept_id) -- Kunci primer dapat disimpulkan dari logika SQL. Namun, karena MV partisi hanya mendukung mode BUILD DEFERRED yang memerlukan deklarasi kunci primer eksplisit, Anda harus mendeklarasikannya di sini.
LIFECYCLE 10
BUILD DEFERRED
PARTITIONED BY (pt)
TBLPROPERTIES('refresh_mode'='incremental',
'refresh_job_settings'='set odps.task.major.version=sql_flighting_dlmv;')
AS
-- t_department adalah tabel ingestion near-real-time yang terutama berisi data inkremental hari ini.
SELECT *, get_setting('odps.custom.setting.department.pt') AS pt FROM t_department;
UNION ALL
-- history_t_department adalah tabel partisi historis yang berisi semua data historis.
SELECT * FROM history_t_department;Skenario 2: Gunakan group by key untuk menurunkan kolom PK dari dlmv.
// pk delta table
CREATE TABLE dlmv_base_table(
key STRING NOT NULL PRIMARY KEY,
value BIGINT,
value2 BIGINT
)
STORED AS ALIORC
TBLPROPERTIES (
'transactional' = 'true',
'cdc.insert.into.passthrough.enable' = 'true',
'acid.cdc.mode.enable' = 'true',
'acid.cdc.build.async' = 'false'
);
CREATE MATERIALIZED VIEW dlmv_pt
PRIMARY KEY(value) -- Kunci primer dapat disimpulkan dari logika SQL. Namun, karena MV partisi hanya mendukung mode BUILD DEFERRED yang memerlukan deklarasi kunci primer eksplisit, Anda harus mendeklarasikannya di sini.
build deferred
partitioned BY (pt)
TBLPROPERTIES (
'refresh_mode' = 'incremental',
'enable_auto_refresh' = 'true'
)
AS SELECT *, get_setting('odps.custom.setting.dlmv_pt.pt') AS pt FROM (SELECT value, MAX(value2) FROM dlmv_base_table GROUP BY value) t;Skenario 3: Simpulkan kolom kunci primer Delta Live MV dari kunci primer tabel dasar.
// pk delta table
CREATE TABLE dlmv_base_table(
key STRING NOT NULL PRIMARY KEY,
value BIGINT,
value2 BIGINT
)
STORED AS ALIORC
TBLPROPERTIES (
'transactional' = 'true',
'cdc.insert.into.passthrough.enable' = 'true',
'acid.cdc.mode.enable' = 'true',
'acid.cdc.build.async' = 'false'
);
CREATE MATERIALIZED VIEW dlmv_pt
PRIMARY KEY(key) --Kunci primer dapat disimpulkan dari logika SQL. Namun, karena MV partisi hanya mendukung mode BUILD DEFERRED yang memerlukan deklarasi kunci primer eksplisit, Anda harus mendeklarasikannya di sini.
build deferred
partitioned BY (pt)
TBLPROPERTIES (
'refresh_mode' = 'incremental',
'enable_auto_refresh' = 'true'
)
AS
SELECT key, value, value2, get_setting('odps.custom.setting.dlmv_pt.pt') as pt FROM dlmv_base_table;Skenario 4: Kolom kunci primer Delta Live MV tidak dapat disimpulkan.
// pk delta table
CREATE TABLE dlmv_base_table(
key STRING NOT NULL PRIMARY KEY,
value BIGINT,
value2 BIGINT
)
STORED AS ALIORC
TBLPROPERTIES (
'transactional' = 'true',
'cdc.insert.into.passthrough.enable' = 'true',
'acid.cdc.mode.enable' = 'true',
'acid.cdc.build.async' = 'false'
);
# 1. Deklarasikan kolom kunci primer secara eksplisit
CREATE MATERIALIZED VIEW dlmv_pt
primary key(value) -- Kolom kunci primer tidak dapat disimpulkan sebagai 'value' dari logika SQL, tetapi pengguna tahu bahwa data itu sendiri memenuhi keunikan kunci primer. Kunci primer harus dideklarasikan secara eksplisit.
build deferred
partitioned BY (pt)
TBLPROPERTIES (
'refresh_mode' = 'incremental',
'enable_auto_refresh' = 'true'
)
AS
SELECT value, value2, get_setting('odps.custom.setting.dlmv_pt.pt') as pt FROM dlmv_base_table;
# 2. Ubah logika SQL agar memungkinkan inferensi kunci primer.
-- Jika keunikan kolom 'value' tidak dapat dijamin, logika dapat dimodifikasi dengan klausa group by, seperti di bawah ini:
CREATE MATERIALIZED VIEW dlmv_pt
primary key(value) -- Kunci primer dapat disimpulkan dari logika SQL. Namun, karena MV partisi hanya mendukung mode BUILD DEFERRED yang memerlukan deklarasi kunci primer eksplisit, Anda harus mendeklarasikannya di sini.
build deferred
partitioned BY (pt)
TBLPROPERTIES (
'refresh_mode' = 'incremental',
'enable_auto_refresh' = 'true'
)
AS SELECT value, MAX(value2), get_setting('odps.custom.setting.dlmv_pt.pt') as pt FROM dlmv_base_table GROUP BY value;Non-partisi Delta Live MV
Skenario 1: Dengan menggunakan group by key, Anda dapat menurunkan kolom PK dari DLMV.
// pk delta table
CREATE TABLE dlmv_base_table(
key STRING NOT NULL PRIMARY KEY,
value BIGINT,
value2 BIGINT
)
STORED AS ALIORC
TBLPROPERTIES (
'transactional' = 'true',
'cdc.insert.into.passthrough.enable' = 'true',
'acid.cdc.mode.enable' = 'true',
'acid.cdc.build.async' = 'false'
);
CREATE MATERIALIZED VIEW dlmv
-- primary key(value) dapat disimpulkan dari logika SQL (group by value), sehingga deklarasi eksplisit tidak diperlukan.
TBLPROPERTIES (
'refresh_mode' = 'incremental',
'enable_auto_refresh' = 'true'
)
AS SELECT value, MAX(value2) FROM dlmv_base_table GROUP BY value;Skenario 2: Simpulkan kolom kunci primer Delta Live MV dari kunci primer tabel dasar.
// pk delta table
CREATE TABLE dlmv_base_table(
key STRING NOT NULL PRIMARY KEY,
value BIGINT,
value2 BIGINT
)
STORED AS ALIORC
TBLPROPERTIES (
'transactional' = 'true',
'cdc.insert.into.passthrough.enable' = 'true',
'acid.cdc.mode.enable' = 'true',
'acid.cdc.build.async' = 'false'
);
CREATE MATERIALIZED VIEW dlmv
-- primary key(key) dapat disimpulkan dari logika SQL (diturunkan dari kunci primer tabel dasar), sehingga deklarasi eksplisit tidak diperlukan.
TBLPROPERTIES (
'refresh_mode' = 'incremental',
'enable_auto_refresh' = 'true'
)
AS
SELECT key, value, value2 FROM dlmv_base_table;Skenario 3: Kolom kunci primer Delta Live MV tidak dapat disimpulkan.
// pk delta table
CREATE TABLE dlmv_base_table(
key STRING NOT NULL PRIMARY KEY,
value BIGINT,
value2 BIGINT
)
STORED AS ALIORC
TBLPROPERTIES (
'transactional' = 'true',
'cdc.insert.into.passthrough.enable' = 'true',
'acid.cdc.mode.enable' = 'true',
'acid.cdc.build.async' = 'false'
);
# 1. Deklarasikan kolom kunci primer secara eksplisit
CREATE MATERIALIZED VIEW dlmv
primary key(value) -- Kolom kunci primer tidak dapat disimpulkan sebagai 'value' dari logika SQL, tetapi pengguna tahu bahwa data itu sendiri memenuhi keunikan kunci primer. Kunci primer harus dideklarasikan secara eksplisit.
TBLPROPERTIES (
'refresh_mode' = 'incremental',
'enable_auto_refresh' = 'true'
)
AS
SELECT value, value2 FROM dlmv_base_table;
# 2. Ubah logika SQL agar memungkinkan inferensi kunci primer
-- Jika keunikan kolom 'value' tidak dapat dijamin, logika dapat dimodifikasi dengan klausa group by, seperti di bawah ini:
CREATE MATERIALIZED VIEW dlmv
-- primary key(value) dapat disimpulkan dari logika SQL (group by value), sehingga deklarasi eksplisit tidak diperlukan.
TBLPROPERTIES (
'refresh_mode' = 'incremental',
'enable_auto_refresh' = 'true'
)
AS SELECT value, MAX(value2) FROM dlmv_base_table GROUP BY value;Contoh 3: Segarkan satu partisi
Saat membuat Delta Live MV partisi, Anda harus menambahkan kata kunci BUILD DEFERRED untuk menunjukkan bahwa hanya operasi DDL yang dilakukan.
-- Buat 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;
-- Segarkan satu partisi.
ALTER MATERIALIZED VIEW dlmv_pt REBUILD PARTITION(ds='20250730');Untuk informasi selengkapnya tentang cara menyegarkan Delta Live MV, lihat Segarkan Delta Live MV secara manual.
Contoh 4: Gunakan definisi berparameter
Penggunaan definisi berparameter dapat membantu Anda memigrasikan pekerjaan partisi offline ke pekerjaan inkremental.
Fungsi
get_settingdidukung untuk mengambil nilai parameter yang ditetapkan dalam flag sesi. Parameter tersebut harus diawali dengandps.custom.setting.Ganti
${biz_date}dalam pekerjaan offline tradisional denganget_setting(odps.custom.setting.xx)untuk menyelesaikan parameterisasi.Tambahkan flag sesi
set odps.custom.setting.xx=yysebelum pernyataan penyegaran Delta Live MV.Saat runtime, pengoptimal MaxCompute secara otomatis mengganti
get_setting(odps.custom.setting.xx)dalam Delta Live MV denganyy.
Contoh:
-- Buat Delta Live MV.
CREATE MATERIALIZED VIEW mv1
BUILD DEFERRED -- Hanya DDL; tidak ada data yang dihasilkan.
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');
-- Logika penyegaran: Penjadwalan DataWorks secara otomatis mengganti ${biz_date} dan ${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});Kelola Delta Live MV
Hapus Delta Live MV
DROP MATERIALIZED VIEW [IF EXISTS] [<project_name>.]<mv_name>;Penyegaran manual
Anda dapat menyegarkan Delta Live MV secara manual. Penyegaran manual hanya mendukung satu partisi.
ALTER MATERIALIZED VIEW [<project_name>.]<mv_name>
REBUILD [PARTITION(<ds>=max_pt(<table_name>),<expression1>...)];Dalam sintaks ini, ds adalah kolom partisi.
Nonaktifkan penyegaran otomatis
Untuk menonaktifkan fitur penyegaran otomatis, jalankan perintah berikut:
ALTER MATERIALIZED VIEW <mv_name> SET TBLPROPERTIES("enable_auto_refresh"="false");Lanjutkan penyegaran otomatis
Jalankan perintah berikut untuk mengubah TBLPROPERTIES tampilan yang di-materialisasi guna mengaktifkan atau melanjutkan penyegaran otomatis.
ALTER MATERIALIZED VIEW <mv_name> SET TBLPROPERTIES("enable_auto_refresh"="true");Ubah frekuensi penyegaran
Jalankan perintah berikut untuk mengubah frekuensi penyegaran Delta Live MV.
ALTER MATERIALIZED VIEW <mv_name>
SET TBLPROPERTIES("refresh_interval_minutes"="xx");Nilai minimum untuk parameter refresh_interval_minutes adalah 1. Kami menyarankan Anda mengatur nilai ini lebih kecil daripada siklus hidup CDC tabel dasar.
Lihat Delta Live MV
Lihat riwayat perubahan data
Jalankan perintah berikut untuk melihat catatan perubahan data Delta Live MV.
SHOW HISTORY FOR TABLE <mv_name>;Contoh hasil:
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 UPDATELihat riwayat penyegaran
Jalankan perintah berikut untuk melihat riwayat penyegaran Delta Live MV.
SELECT * FROM
Delta_Live_MV_Refresh_History(['<project_name>', '<schema_name>',]'<table_name>');Parameter
Parameter | Deskripsi |
project_name | Nama proyek. |
schema_name | Nama skema. |
table_name | Nama tabel. |
Nilai kembalian
Bidang | Deskripsi |
project_name | Proyek yang berisi Delta Live MV. |
schema_name | Skema yang berisi Delta Live MV. |
name | Nama Delta Live MV. |
refresh_start_time | Waktu mulai penyegaran. |
refresh_end_time | Waktu berakhir penyegaran. Jika |
instance_id | ID pekerjaan. Anda dapat menggunakan ID ini untuk membuka Logview. |
duration_in_seconds | Durasi penyegaran. |
state | Status pekerjaan.
|
refresh_trigger | Metode penyegaran.
|
refresh_mode | Mode penyegaran.
|
error_message | Informasi tentang kegagalan penyegaran. Jika penyegaran berhasil, nilai ini adalah NULL. |
source_tables | Nama dan versi tabel dasar yang digunakan untuk penyegaran. |
numInsertedRows | Jumlah baris yang dimasukkan. |
numDeletedRows | Jumlah baris yang dihapus. |
Penagihan
Delta Live MV dikenai biaya komputasi dan penyimpanan, dengan metode penagihan yang sama seperti operasi tampilan yang di-materialisasi biasa.
Biaya Komputasi
Saat Anda membuat atau menyegarkan Delta Live MV, sumber daya komputasi akan dikonsumsi dan dikenai biaya jika pekerjaan dimulai untuk menghitung data. Aturan penagihan sama dengan pekerjaan SQL standar.
Jika penyegaran otomatis dipicu tetapi tidak ada perubahan data, MaxCompute tidak menjalankan pekerjaan penyegaran sehingga tidak ada biaya yang dikenakan.
Kami menyarankan menempatkan Delta Live MV di proyek khusus untuk memudahkan pelacakan pekerjaan penyegaran otomatis, penggunaan sumber daya komputasi, dan biaya terkait.
Biaya Penyimpanan
Delta Live MV dikenai biaya penyimpanan dengan cara yang sama seperti tampilan yang di-materialisasi standar dan tabel biasa.
Untuk beberapa operator, Delta Live MV mungkin menggunakan algoritma komputasi inkremental berbasis status, yang menghasilkan tabel status internal dan mengonsumsi penyimpanan tambahan.
Delta Live MV menimbulkan overhead penyimpanan untuk CDC dan Time Travel, yang besarnya mirip dengan Delta Table standar.