Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
Pipeline Lakeflow menyederhanakan penangkapan data perubahan (CDC) dengan API AUTO CDC dan AUTO CDC FROM SNAPSHOT. API ini mengotomatiskan kompleksitas komputasi dimensi yang berubah secara perlahan (SCD) Tipe 1 dan Tipe 2 dari umpan CDC atau rekam jepret database.
AUTO CDC API juga mendukung pelacakan bitemporal, yang mencatat perubahan di dua dimensi waktu (Beta). Untuk mempelajari selengkapnya tentang SCD Tipe 1 dan Tipe 2, lihat Mengubah tangkapan data dan rekam jepret. Untuk informasi selengkapnya tentang pelacakan bitemporal, lihat Bitemporal AUTO CDC.
Nota
AUTO CDC API menggantikan APPLY CHANGES API dan memiliki sintaks yang sama.
APPLY CHANGES API masih tersedia, tetapi Databricks merekomendasikan penggunaan AUTO CDC API di tempatnya.
API yang Anda gunakan bergantung pada sumber data perubahan Anda:
-
AUTO CDC: Gunakan ini saat database sumber mengaktifkan umpan CDC.AUTO CDCmemproses perubahan dari aliran data perubahan (CDF). Ini didukung dalam antarmuka SQL dan Python yang berbasis pipelining. -
AUTO CDC FROM SNAPSHOT: Gunakan ini ketika CDC tidak diaktifkan pada database sumber dan hanya rekam jepret yang tersedia. API ini membandingkan rekam jepret untuk menentukan perubahan lalu memprosesnya. Ini didukung dalam antarmuka SQL dan Python yang berbasis pipelining.
Untuk target SCD Tipe 1, Anda juga dapat menggabungkan aliran AUTO CDC FROM SNAPSHOT dengan satu atau lebih AUTO CDC aliran. Gunakan pola ini ketika sumber menyediakan snapshot otoritatif berkala dan feed CDC dengan latensi rendah antar snapshot.
Kedua API mendukung pembaruan tabel menggunakan SCD Tipe 1 dan Tipe 2:
- Gunakan SCD Tipe 1 untuk memperbarui rekaman secara langsung. Riwayat tidak dipertahankan untuk rekaman yang diperbarui.
- Gunakan SCD Tipe 2 untuk menyimpan riwayat rekaman, baik pada semua pembaruan atau pembaruan untuk sekumpulan kolom tertentu.
Khusus untuk AUTO CDC, Anda juga dapat menggunakan penyimpanan bitemporal, yang memperluas riwayat SCD Type 2 untuk melacak perubahan dalam dua dimensi waktu: waktu bisnis dan waktu sistem. Bitemporal ada di Beta. Lihat Bitemporal AUTO CDC.
AUTO CDC juga mendukung pembaruan parsial, di mana rekaman perubahan hanya memperbarui subset kolom. Lihat Menerapkan pembaruan parsial.
AUTO CDC API tidak didukung oleh Alur Deklaratif Apache Spark.
Untuk sintaksis dan referensi lainnya, lihat AUTO CDC INTO (pipelines), create_auto_cdc_flow, dan create_auto_cdc_from_snapshot_flow.
Nota
Gunakan API ini untuk memperbarui tabel di pipeline Anda berdasarkan perubahan data sumber. Untuk mempelajari cara merekam dan mengkueri informasi perubahan tingkat baris untuk tabel Delta, lihat Menggunakan umpan data perubahan pada Azure Databricks.
Persyaratan
Untuk menggunakan API CDC, pipeline Anda harus dikonfigurasi untuk menggunakan pipeline Lakeflow nirserver atau pipeline Lakeflow Pro atau Advancededisi.
Cara kerja AUTO CDC
Untuk melakukan pemrosesan CDC dengan AUTO CDC, buat tabel streaming lalu gunakan AUTO CDC ... INTO pernyataan di SQL atau create_auto_cdc_flow() fungsi di Python untuk menentukan sumber, kunci, dan pengurutan umpan perubahan. Untuk penjelasan tentang cara kerja pengurutan dan logika SCD, lihat Mengubah pengambilan data dan rekam jepret. Lihat contoh OTOMATIS CDC.
Untuk hidrasi awal dari sumber dengan umpan perubahan, gunakan AUTO CDC dengan once alur lalu lanjutkan pemrosesan umpan perubahan. Lihat Mereplikasi tabel RDBMS eksternal menggunakan CDC OTOMATIS.
Untuk detail sintaks, lihat AUTO CDC INTO (pipelines) atau create_auto_cdc_flow.
Cara kerja AUTO CDC FROM SNAPSHOT
AUTO CDC FROM SNAPSHOT menentukan perubahan dalam data sumber dengan membandingkan rekam jepret dalam urutan. Anda dapat membaca rekam jepret dari tabel Delta, file penyimpanan cloud, atau JDBC secara langsung. Ini didukung dalam antarmuka SQL dan Python yang berbasis pipelining.
Untuk melakukan pemrosesan CDC dengan AUTO CDC FROM SNAPSHOT, buat tabel streaming lalu definisikan alurnya:
- Dalam SQL, gunakan bentuk
AUTO CDC ... FROM SNAPSHOTdari pernyataanCREATE FLOWatau klausaFLOW AUTO CDCyang disematkan dalamCREATE STREAMING TABLE. Sumber adalah klausa wajibFROM SNAPSHOT (snapshot_query)dan klausa opsionalWITH VERSION (version_query)yang memilih versi snapshot berikutnya untuk diproses. Lihat CREATE FLOW (pipeline). - Dalam Python, gunakan fungsi
create_auto_cdc_from_snapshot_flow()untuk menentukan snapshot, kunci, dan argumen lainnya. Lihat create_auto_cdc_from_snapshot_flow.
Untuk detail tentang dua pola penyerapan dan kapan menggunakan masing-masing pola, lihat Pola pemrosesan rekam jepret. Lihat contoh AUTO CDC FROM SNAPSHOT.
Gabungkan AUTO CDC FROM SNAPSHOT dan AUTO CDC
Versi snapshot dan kolom pengurutan CDC membentuk satu domain urutan. Peristiwa CDC yang lebih baru dari snapshot terbaru akan lebih diutamakan daripada snapshot. Snapshot yang lebih baru lebih diutamakan dibandingkan event CDC lama dan menganggap kunci yang tidak ada di snapshot sebagai dihapus pada versi snapshot. Event CDC yang lebih baru dapat mempertahankan atau memulihkan kunci tersebut.
Target terpadu harus memenuhi persyaratan berikut:
- Target menggunakan SCD Tipe 1.
- Target memiliki tepat satu
AUTO CDC FROM SNAPSHOTaliran dan satu atau lebihAUTO CDCaliran. - Setiap
AUTO CDCaliran memiliki nama unik. - Semua alur menggunakan jumlah key yang sama dalam urutan yang sama. Nama kunci snapshot-flow dibandingkan tanpa membedakan huruf besar dan kecil dengan nama kunci
AUTO CDC. BeberapaAUTO CDCalur harus menggunakan nama kunci dan casing yang identik. - Versi snapshot dan setiap kolom sequencing CDC memiliki tipe data yang persis sama.
- Alur
AUTO CDC FROM SNAPSHOTtidak mendefinisikan ekspektasi. - Alur
AUTO CDCtidak menggunakanIGNORE NULL UPDATESatau varian daftar kolomnya. - Pipeline menggunakan mode pemicu.
- Jika Anda menambahkan
AUTO CDCflow ke targetAUTO CDC FROM SNAPSHOTyang sudah ada, target tersebut tidak boleh berisi kolom pengguna yang namanya bertentangan dengan kolom sistemAUTO CDCyang dicadangkan.
Baik AUTO CDC alur maupun AUTO CDC FROM SNAPSHOT alur dapat menggunakan antarmuka pipeline Python atau SQL. Anda dapat mencampur alur SQL dan Python dalam target yang sama.
Gunakan once=True di Python atau ONCE di SQL pada alur AUTO CDC FROM SNAPSHOT untuk melakukan backfill pada snapshot satu kali sementara alur AUTO CDC terus memproses peristiwa baru pada pembaruan berikutnya. Penyegaran penuh target menjalankan ulang alur snapshot sekali jalan. Untuk contoh lengkap, lihat Tambahkan backfill ke tabel AUTO CDC SCD Type 1.
Pola ini tidak mendukung target SCD Tipe 2 atau bitemporal.
Menggunakan beberapa kolom untuk pengurutan
Untuk mengurutkan menurut beberapa kolom (misalnya, tanda waktu dan ID untuk memutuskan ikatan), gunakan STRUCT untuk menggabungkannya. API mengurutkan berdasarkan bidang pertama terlebih dahulu, dan jika terjadi kedudukan seri, mempertimbangkan bidang kedua, dan seterusnya.
SQL
SEQUENCE BY STRUCT(timestamp_col, id_col)
Phyton
sequence_by = struct("timestamp_col", "id_col")
Contoh CDC OTOMATIS
Contoh berikut menunjukkan pemrosesan SCD Tipe 1 dan Tipe 2 menggunakan sumber umpan data perubahan. Data sampel membuat rekaman pengguna baru, menghapus rekaman pengguna, dan memperbarui rekaman pengguna. Dalam contoh SCD Tipe 1, operasi terakhir UPDATE datang terlambat dan dihilangkan dari tabel target, menunjukkan penanganan peristiwa yang tidak berurutan.
Berikut ini adalah catatan input yang digunakan dalam contoh ini. Data ini dibuat dengan menjalankan kueri di bagian Buat data sampel .
| userId | Nama | city | operasi | nomorUrut |
|---|---|---|---|---|
| 124 | Raul | Oaxaca | INSERT | 1 |
| 123 | Isabel | Monterrey | INSERT | 1 |
| 125 | Mercedes | Tijuana | INSERT | 2 |
| 126 | Lily | Cancun | INSERT | 2 |
| 123 | nol | nol | DELETE | 6 |
| 125 | Mercedes | Guadalajara | UPDATE | 6 |
| 125 | Mercedes | Mexicali | UPDATE | 5 |
| 123 | Isabel | Chihuahua | UPDATE | 5 |
Jika Anda menghapus komentar baris akhir dalam kueri pembuatan data sampel, baris tersebut menambahkan catatan berikut yang menentukan untuk mengosongkan tabel (mengosongkan tabel) di sequenceNum=3.
| userId | Nama | city | operasi | nomorUrut |
|---|---|---|---|---|
| nol | nol | nol | MENGHAPUS | 3 |
Nota
Semua contoh berikut menyertakan opsi untuk menentukan operasi DELETE dan TRUNCATE , tetapi masing-masing bersifat opsional.
Membuat data sampel
Jalankan pernyataan berikut untuk membuat himpunan data sampel. Kode ini tidak dimaksudkan untuk dijalankan sebagai bagian dari definisi alur. Jalankan dari folder eksplorasi alur Anda, bukan folder transformasi.
CREATE SCHEMA IF NOT EXISTS main.cdc_tutorial;
CREATE TABLE main.cdc_tutorial.users_cdf
AS SELECT
col1 AS userId,
col2 AS name,
col3 AS city,
col4 AS operation,
col5 AS sequenceNum
FROM (
VALUES
-- Initial load.
(124, "Raul", "Oaxaca", "INSERT", 1),
(123, "Isabel", "Monterrey", "INSERT", 1),
-- New users.
(125, "Mercedes", "Tijuana", "INSERT", 2),
(126, "Lily", "Cancun", "INSERT", 2),
-- Isabel is removed from the system and Mercedes moved to Guadalajara.
(123, null, null, "DELETE", 6),
(125, "Mercedes", "Guadalajara", "UPDATE", 6),
-- This batch of updates arrived out of order. The batch at sequenceNum 6 is the final state.
(125, "Mercedes", "Mexicali", "UPDATE", 5),
(123, "Isabel", "Chihuahua", "UPDATE", 5)
-- Uncomment to test TRUNCATE.
-- ,(null, null, null, "TRUNCATE", 3)
);
Proses pembaruan SCD Tipe 1
SCD Tipe 1 hanya menyimpan versi terbaru dari setiap rekaman. Contoh berikut membaca dari umpan data perubahan yang dibuat di atas dan menerapkan perubahan pada target tabel streaming. Anda membutuhkan pipeline untuk menjalankan kode ini. Lihat Mengembangkan dan men-debug alur ETL dengan Editor Alur Lakeflow.
Phyton
from pyspark import pipelines as dp
from pyspark.sql.functions import col, expr
@dp.view
def users():
return spark.readStream.table("main.cdc_tutorial.users_cdf")
dp.create_streaming_table("users_current")
dp.create_auto_cdc_flow(
target = "users_current",
source = "users",
keys = ["userId"],
sequence_by = col("sequenceNum"),
apply_as_deletes = expr("operation = 'DELETE'"),
apply_as_truncates = expr("operation = 'TRUNCATE'"),
except_column_list = ["operation", "sequenceNum"],
stored_as_scd_type = 1
)
SQL
CREATE OR REFRESH STREAMING TABLE users_current;
CREATE FLOW apply_cdc AS AUTO CDC INTO
users_current
FROM
stream(main.cdc_tutorial.users_cdf)
KEYS
(userId)
APPLY AS DELETE WHEN
operation = "DELETE"
APPLY AS TRUNCATE WHEN
operation = "TRUNCATE"
SEQUENCE BY
sequenceNum
COLUMNS * EXCEPT
(operation, sequenceNum)
STORED AS
SCD TYPE 1;
Setelah menjalankan contoh SCD Tipe 1, tabel target berisi rekaman berikut:
| userId | Nama | city |
|---|---|---|
| 124 | Raul | Oaxaca |
| 125 | Mercedes | Guadalajara |
| 126 | Lily | Cancun |
Pengguna 123 (Isabel) dihapus dan tidak muncul. Pengguna 125 (Mercedes) memperlihatkan hanya kota terbaru (Guadalajara) karena SCD Tipe 1 mengganti nilai sebelumnya. Pembaruan sebelumnya di UPDATE pada sequenceNum=5 dihapus karena pembaruan yang lebih baru di sequenceNum=6 sudah tersedia.
Setelah menjalankan contoh dengan rekaman yang TRUNCATE telah dihapus komentar, tabel dibersihkan di sequenceNum=3. Ini berarti bahwa rekaman 124 dan 126 tidak ada dalam tabel, dan tabel target akhir hanya berisi rekaman berikut:
| userId | Nama | city |
|---|---|---|
| 125 | Mercedes | Guadalajara |
Proses pembaruan SCD Tipe 2
SCD Tipe 2 mempertahankan riwayat lengkap perubahan dengan membuat baris baru untuk setiap versi catatan, dengan kolom __START_AT dan kolom __END_AT yang menunjukkan periode aktif setiap versi.
Phyton
from pyspark import pipelines as dp
from pyspark.sql.functions import col, expr
@dp.view
def users():
return spark.readStream.table("main.cdc_tutorial.users_cdf")
dp.create_streaming_table("users_history")
dp.create_auto_cdc_flow(
target = "users_history",
source = "users",
keys = ["userId"],
sequence_by = col("sequenceNum"),
apply_as_deletes = expr("operation = 'DELETE'"),
except_column_list = ["operation", "sequenceNum"],
stored_as_scd_type = "2"
)
SQL
CREATE OR REFRESH STREAMING TABLE users_history;
CREATE FLOW apply_cdc AS AUTO CDC INTO
users_history
FROM
stream(main.cdc_tutorial.users_cdf)
KEYS
(userId)
APPLY AS DELETE WHEN
operation = "DELETE"
SEQUENCE BY
sequenceNum
COLUMNS * EXCEPT
(operation, sequenceNum)
STORED AS
SCD TYPE 2;
Setelah menjalankan contoh SCD Tipe 2, tabel target berisi rekaman berikut:
| userId | Nama | city | __START_AT | __END_AT |
|---|---|---|---|---|
| 123 | Isabel | Monterrey | 1 | 5 |
| 123 | Isabel | Chihuahua | 5 | 6 |
| 124 | Raul | Oaxaca | 1 | nol |
| 125 | Mercedes | Tijuana | 2 | 5 |
| 125 | Mercedes | Mexicali | 5 | 6 |
| 125 | Mercedes | Guadalajara | 6 | nol |
| 126 | Lily | Cancun | 2 | nol |
Tabel menyimpan seluruh riwayat. Pengguna 123 memiliki dua versi (berakhir pada urutan 6 saat dihapus). Pengguna 125 memiliki tiga versi yang menunjukkan perubahan kota. Rekaman dengan __END_AT = null saat ini aktif.
Melacak subkumpulan kolom dengan Tipe 2 SCD
Secara default, SCD Tipe 2 membuat versi baru setiap kali nilai kolom berubah. Anda dapat menentukan subset kolom yang akan dilacak, sehingga perubahan pada kolom lain memperbarui versi saat ini di tempat daripada membuat rekaman riwayat baru.
Contoh berikut mengecualikan city kolom dari pelacakan riwayat:
Phyton
from pyspark import pipelines as dp
from pyspark.sql.functions import col, expr
@dp.view
def users():
return spark.readStream.table("main.cdc_tutorial.users_cdf")
dp.create_streaming_table("users_history")
dp.create_auto_cdc_flow(
target = "users_history",
source = "users",
keys = ["userId"],
sequence_by = col("sequenceNum"),
apply_as_deletes = expr("operation = 'DELETE'"),
except_column_list = ["operation", "sequenceNum"],
stored_as_scd_type = "2",
track_history_except_column_list = ["city"]
)
SQL
CREATE OR REFRESH STREAMING TABLE users_history;
CREATE FLOW apply_cdc AS AUTO CDC INTO
users_history
FROM
stream(main.cdc_tutorial.users_cdf)
KEYS
(userId)
APPLY AS DELETE WHEN
operation = "DELETE"
SEQUENCE BY
sequenceNum
COLUMNS * EXCEPT
(operation, sequenceNum)
STORED AS
SCD TYPE 2
TRACK HISTORY ON * EXCEPT
(city)
Karena city perubahan tidak dilacak, update kota menggantikan baris yang ada alih-alih membuat versi baru. Tabel target berisi rekaman berikut:
| userId | Nama | city | __START_AT | __END_AT |
|---|---|---|---|---|
| 123 | Isabel | Chihuahua | 1 | 6 |
| 124 | Raul | Oaxaca | 1 | nol |
| 125 | Mercedes | Guadalajara | 2 | nol |
| 126 | Lily | Cancun | 2 | nol |
Contoh CDC Otomatis dari Cuplikan
Bagian berikut ini menyediakan contoh penggunaan AUTO CDC FROM SNAPSHOT untuk memproses rekam jepret ke dalam tabel target SCD Tipe 1 atau Tipe 2. Untuk latar belakang tentang kapan menggunakan API ini, lihat Mengubah tangkapan data dan rekam jepret.
Contoh dalam bagian ini meliputi implementasi Python dan SQL. Untuk sintaks SQL lengkap, lihat CREATE FLOW (pipelines).
Contoh: Proses snapshot berkala
Gunakan pendekatan ini ketika snapshot tiba secara rutin dan berurutan. Antarmuka Python menggunakan urutan pembaruan pipeline untuk pengelolaan versi. Untuk SQL, contoh menggunakan tabel versi terpisah untuk mengidentifikasi kapan snapshot baru tersedia.
Anda dapat membaca rekam jepret dari beberapa jenis sumber, termasuk tabel Delta, file penyimpanan cloud, dan koneksi JDBC.
Langkah 1: Membuat data sampel
Buat tabel yang berisi data rekam jepret. Jalankan kode berikut dari notebook atau Databricks SQL di explorations folder alur Anda:
CREATE SCHEMA IF NOT EXISTS main.cdc_tutorial;
CREATE TABLE main.cdc_tutorial.snapshot (
userId INT,
city STRING
);
CREATE TABLE main.cdc_tutorial.snapshot_version (
version BIGINT
);
INSERT INTO main.cdc_tutorial.snapshot VALUES
(1, 'Oaxaca'),
(2, 'Monterrey'),
(3, 'Tijuana');
INSERT INTO main.cdc_tutorial.snapshot_version VALUES (0);
Langkah 2: Jalankan CDC OTOMATIS DARI REKAM JEPRET
Anda membutuhkan pipeline untuk menjalankan kode pada langkah ini. Lihat Mengembangkan dan men-debug alur ETL dengan Editor Alur Lakeflow.
Untuk Python, pilih tipe sumber untuk tampilan snapshot (kode pembuatan contoh menghasilkan tabel Delta):
Opsi A: Membaca dari tabel Delta
from pyspark import pipelines as dp
@dp.view(name="source")
def source():
return spark.read.table("main.cdc_tutorial.snapshot")
Opsi B: Membaca dari penyimpanan awan
from pyspark import pipelines as dp
@dp.view(name="source")
def source():
return spark.read.format("csv").option("header", True).load("<snapshot-path>")
Opsi C: Baca dari JDBC (hanya komputasi klasik)
from pyspark import pipelines as dp
@dp.view(name="source")
def source():
return (spark.read
.format("jdbc")
.option("url", "<jdbc-url>")
.option("dbtable", "<table-name>")
.option("user", "<username>")
.option("password", "<password>")
.load()
)
Kemudian tambahkan tabel target dan flow. Implementasi SQL menggunakan snapshot_version tabel untuk mengidentifikasi kapan snapshot baru tersedia:
Phyton
dp.create_streaming_table("target")
dp.create_auto_cdc_from_snapshot_flow(
target = "target",
source = "source",
keys = ["userId"],
stored_as_scd_type = 2
)
SQL
CREATE OR REFRESH STREAMING TABLE target;
CREATE FLOW target_snapshot_flow AS
AUTO CDC INTO target
FROM SNAPSHOT (
SELECT userId, city
FROM main.cdc_tutorial.snapshot
)
WITH VERSION (
SELECT version
FROM main.cdc_tutorial.snapshot_version
WHERE (
NOT EXISTS (SELECT 1 FROM last_snapshot_version())
OR version > (SELECT version FROM last_snapshot_version())
)
)
KEYS (userId)
STORED AS SCD TYPE 2;
Setelah pemrosesan jalur pertama, semua catatan dimasukkan sebagai baris aktif.
| userId | city | __START_AT | __END_AT |
|---|---|---|---|
| 1 | Oaxaca | 0 | nol |
| 2 | Monterrey | 0 | nol |
| 3 | Tijuana | 0 | nol |
Nota
Untuk menggunakan SCD Type 1 sebagai gantinya dan hanya mempertahankan status saat ini, atur stored_as_scd_type=1 di Python atau STORED AS SCD TYPE 1 SQL. Dalam hal ini, tabel target tidak menyertakan kolom __START_AT dan __END_AT.
Langkah 3: Mensimulasikan rekam jepret baru dan menjalankan ulang
Perbarui tabel sumber untuk mensimulasikan snapshot baru yang tiba (jalankan kode ini dari notebook atau file SQL di explorations folder pipeline Anda):
TRUNCATE TABLE main.cdc_tutorial.snapshot;
INSERT INTO main.cdc_tutorial.snapshot VALUES
(2, 'Carmel'),
(3, 'Los Angeles'),
(4, 'Death Valley'),
(6, 'Kings Canyon');
UPDATE main.cdc_tutorial.snapshot_version SET version = 1;
Jalankan pipeline lagi.
AUTO CDC FROM SNAPSHOT membandingkan rekam jepret baru dengan yang sebelumnya dan mendeteksi bahwa pengguna 1 dihapus, pengguna 2 dan 3 diperbarui, dan pengguna 4 dan 6 dimasukkan. Ini menghasilkan umpan perubahan, dan menggunakan AUTO CDC untuk membuat tabel output.
Setelah eksekusi kedua dengan SCD Tipe 2, tabel target berisi rekaman berikut:
| userId | city | __START_AT | __END_AT |
|---|---|---|---|
| 1 | Oaxaca | 0 | 1 |
| 2 | Monterrey | 0 | 1 |
| 2 | Carmel | 1 | nol |
| 3 | Tijuana | 0 | 1 |
| 3 | Los Angeles | 1 | nol |
| 4 | Lembah Kematian | 1 | nol |
| 6 | Kings Canyon | 1 | nol |
Pengguna 1 berakhir (dihapus). Pengguna 2 dan 3 masing-masing memiliki dua versi yang menunjukkan perubahan kota mereka. Pengguna 4 dan 6 baru disisipkan.
Setelah eksekusi kedua dengan SCD Tipe 1, tabel target hanya memperlihatkan status saat ini:
| userId | city |
|---|---|
| 2 | Carmel |
| 3 | Los Angeles |
| 4 | Lembah Kematian |
| 6 | Kings Canyon |
Contoh: Memproses rekam jepret menggunakan fungsi versi
Gunakan pendekatan ini saat Anda memerlukan kontrol eksplisit atas pengurutan rekam jepret. Misalnya, gunakan pendekatan ini saat beberapa rekam jepret tiba pada saat yang sama, atau rekam jepret tidak berurutan. Anda menentukan cara memilih snapshot berikutnya dan nomor versinya. API memproses rekam jepret dalam urutan versi naik:
- Jika beberapa snapshot berada di penyimpanan, pemilih contoh memproses snapshot yang tersedia sesuai urutan versi.
- Jika snapshot tiba tidak sesuai urutan (misalnya,
snapshot_3tiba setelahsnapshot_4), selektor contoh mengecualikannya karena versinya tidak lebih besar dari versi terakhir yang dikomit. - Jika tidak ada snapshot baru, fungsi versi atau kueri tidak mengembalikan hasil dan tidak ada pemrosesan yang terjadi.
Langkah 1: Menyiapkan file rekam jepret
Buat file CSV yang berisi data rekam jepret dan tambahkan ke volume atau lokasi penyimpanan cloud. Beri nama file secara kronologis (misalnya, snapshot_1.csv, snapshot_2.csv).
Setiap file harus berisi kolom untuk userId dan city. Contohnya:
snapshot_1.csv:
| userId | city |
|---|---|
| 1 | Oaxaca |
| 2 | Monterrey |
| 3 | Tijuana |
snapshot_2.csv:
| userId | city |
|---|---|
| 2 | Carmel |
| 3 | Los Angeles |
| 4 | Lembah Kematian |
Langkah 2: Jalankan AUTO CDC FROM SNAPSHOT dengan fungsi versi
Di pipeline, buat file Python atau SQL baru di folder transformations, dan tambahkan kode berikut. Kemudian jalankan pipelin. Lihat Mengembangkan dan men-debug alur ETL dengan Editor Alur Lakeflow.
Phyton
from pyspark import pipelines as dp
from typing import Optional, Tuple
from pyspark.sql import DataFrame
def next_snapshot_and_version(latest_snapshot_version: Optional[int]) -> Optional[Tuple[DataFrame, int]]:
snapshot_dir = "/Volumes/main/cdc_tutorial/snapshots/" # or the location you created the sample data
files = dbutils.fs.ls(snapshot_dir)
snapshot_files = [f.name for f in files if f.name.startswith("snapshot_") and f.name.endswith(".csv")]
snapshot_versions = []
for filename in snapshot_files:
try:
version = int(filename.replace("snapshot_", "").replace(".csv", ""))
snapshot_versions.append(version)
except ValueError:
continue
snapshot_versions.sort()
if latest_snapshot_version is None:
if snapshot_versions:
next_version = snapshot_versions[0]
else:
return None
else:
next_versions = [v for v in snapshot_versions if v > latest_snapshot_version]
if next_versions:
next_version = next_versions[0]
else:
return None
snapshot_path = f"{snapshot_dir}snapshot_{next_version}.csv"
df = spark.read.format("csv").option("header", True).load(snapshot_path)
return (df, next_version)
dp.create_streaming_table("main.cdc_tutorial.target_versioned")
dp.create_auto_cdc_from_snapshot_flow(
target = "main.cdc_tutorial.target_versioned",
source = next_snapshot_and_version,
keys = ["userId"],
stored_as_scd_type = 2
)
SQL
CREATE OR REFRESH STREAMING TABLE main.cdc_tutorial.target_versioned;
CREATE FLOW target_versioned_snapshot_flow AS
AUTO CDC INTO main.cdc_tutorial.target_versioned
FROM SNAPSHOT (
SELECT CAST(userId AS INT) AS userId, city
FROM read_files(
'/Volumes/main/cdc_tutorial/snapshots/',
format => 'csv',
header => true
)
WHERE _metadata.file_name = CONCAT(
'snapshot_',
CAST((SELECT version FROM current_snapshot_version()) AS STRING),
'.csv'
)
)
WITH VERSION (
WITH snapshot_files AS (
SELECT
CAST(REGEXP_EXTRACT(path, 'snapshot_([0-9]+)[.]csv$', 1) AS BIGINT) AS version
FROM list_files('/Volumes/main/cdc_tutorial/snapshots/')
WHERE path RLIKE 'snapshot_[0-9]+[.]csv$'
)
SELECT version
FROM snapshot_files
WHERE (
NOT EXISTS (SELECT 1 FROM last_snapshot_version())
OR version > (SELECT version FROM last_snapshot_version())
)
ORDER BY version
LIMIT 1
)
KEYS (userId)
STORED AS SCD TYPE 2;
Nota
Untuk menggunakan SCD Type 1 sebagai gantinya, atur stored_as_scd_type=1 di Python atau STORED AS SCD TYPE 1 SQL.
Setelah memproses snapshot_1.csv, tabel target berisi rekaman berikut:
| userId | city | __START_AT | __END_AT |
|---|---|---|---|
| 1 | Oaxaca | 1 | nol |
| 2 | Monterrey | 1 | nol |
| 3 | Tijuana | 1 | nol |
Setelah memproses snapshot_2.csv, tabel target berisi rekaman berikut:
| userId | city | __START_AT | __END_AT |
|---|---|---|---|
| 1 | Oaxaca | 1 | 2 |
| 2 | Monterrey | 1 | 2 |
| 2 | Carmel | 2 | nol |
| 3 | Tijuana | 1 | 2 |
| 3 | Los Angeles | 2 | nol |
| 4 | Lembah Kematian | 2 | nol |
Nota
Ingatlah bahwa, untuk SCD Tipe 1, tabel terlihat persis seperti rekam jepret terbaru. Perbedaannya adalah bahwa kueri hilir dapat menggunakan umpan perubahan untuk hanya memproses rekaman yang diubah.
Langkah 3: Tambahkan rekam jepret baru
Tambahkan file CSV baru ke lokasi penyimpanan dengan data yang dimodifikasi (misalnya, nilai kota yang diubah, baris baru, atau baris yang dihapus). Kemudian jalankan alur lagi untuk memproses rekam jepret baru.
Keterbatasan
- Kolom pengurutan harus merupakan tipe data yang dapat diurutkan.
NULLnilai urutan tidak didukung. - Untuk menstream data dari target proses AUTO CDC, baca dari feed perubahannya. Untuk informasi lebih lanjut, lihat Membaca umpan data perubahan dari tabel target CDC OTOMATIS.
Sumber daya tambahan
- Mengubah tangkapan data dan rekam jepret: Pelajari tentang konsep CDC, rekam jepret, dan jenis SCD.
-
Replikasi tabel RDBMS eksternal menggunakan
AUTO CDC: Pelajari cara melakukan hidrasi awal denganoncealur lalu lanjutkan pemrosesan perubahan. - Mengisi ulang data historis dengan pipeline: Pelajari cara mengisi ulang target append-only dan AUTO CDC SCD Tipe 1.
- Topik CDC OTOMATIS Tingkat Lanjut: Pelajari tentang operasi perubahan pada target CDC OTOMATIS, membaca umpan data perubahan, dan metrik pemrosesan.
- Mundur dan putar ulang pipeline: Pelajari cara mengembalikan target AUTO CDC ke titik waktu yang lebih awal dan memproses ulang perubahan.
- Tutorial: Membangun alur ETL menggunakan penangkapan data perubahan