Databricks for Data & AI Engineers
Trang chủ / Module 3
🗄️ Module 3 / 14 · 2 tuần

Delta Lake Fundamentals

ACID transaction, transaction log, time travel, schema evolution, OPTIMIZE/Z-ORDER/VACUUM, Liquid Clustering, MERGE INTO.

Delta LakeACIDTime Travel
📌 Vì sao module này quan trọng

Delta Lake là nền tảng công nghệ cốt lõi biến một Data Lake bình thường thành Lakehouse — gần như mọi bảng bạn tạo trên Databricks đều là bảng Delta. Không hiểu Delta Lake nghĩa là không hiểu vì sao dữ liệu trên Databricks đáng tin cậy hơn Parquet/CSV thô, và sẽ gặp khó khi cần debug lỗi dữ liệu hoặc tối ưu hiệu năng bảng.

🎯 Mục tiêu học tập

  • Giải thích được Delta Lake mang lại ACID transaction cho object storage bằng cách nào (transaction log)
  • Sử dụng Time Travel để truy vấn/khôi phục dữ liệu ở phiên bản trước
  • Áp dụng đúng OPTIMIZE, Z-ORDER/Liquid Clustering, và VACUUM để duy trì hiệu năng bảng
  • Viết được câu lệnh MERGE INTO cho bài toán upsert (CDC)

Transaction Log — trái tim của Delta Lake

Một bảng Delta thực chất là một thư mục chứa các file Parquet cộng thêm một thư mục _delta_log/ ghi lại mọi thay đổi dưới dạng file JSON tuần tự (00000000000000000000.json, 00000000000000000001.json...). Mỗi thao tác ghi (INSERT/UPDATE/DELETE/MERGE) tạo ra một bản ghi log mới mô tả file nào được thêm, file nào bị đánh dấu xoá — đây chính là cơ chế mang lại ACID transaction: một reader luôn thấy trạng thái nhất quán (đọc theo đúng 1 version của log), và ghi đồng thời được xử lý bằng optimistic concurrency control (phát hiện xung đột và retry thay vì khoá bảng).

Time Travel

-- Truy vấn dữ liệu ở phiên bản cụ thể
SELECT * FROM sales VERSION AS OF 12;

-- Truy vấn dữ liệu tại một thời điểm
SELECT * FROM sales TIMESTAMP AS OF '2026-09-01';

-- Khôi phục toàn bộ bảng về phiên bản trước (vd. sau khi xoá nhầm dữ liệu)
RESTORE TABLE sales TO VERSION AS OF 12;

-- Xem lịch sử thay đổi của bảng
DESCRIBE HISTORY sales;

Time Travel hữu ích cho: khôi phục sau lỗi thao tác (xoá/update nhầm), audit dữ liệu đã thay đổi thế nào theo thời gian, và tái tạo lại kết quả một báo cáo/model đã chạy trong quá khứ với đúng dữ liệu tại thời điểm đó (reproducibility — quan trọng khi kết hợp với MLflow ở Module 9).

Schema Evolution & Enforcement

Mặc định, Delta Lake từ chối ghi dữ liệu có schema không khớp bảng đích (schema enforcement) — tránh lỗi âm thầm khi nguồn dữ liệu thay đổi cấu trúc ngoài ý muốn. Khi thay đổi là chủ đích (thêm cột mới), dùng mergeSchema để cho phép schema evolution có kiểm soát:

(df.write
   .format("delta")
   .mode("append")
   .option("mergeSchema", "true")
   .saveAsTable("silver.orders"))

OPTIMIZE, Z-ORDER, Liquid Clustering, VACUUM

  • OPTIMIZE: gộp nhiều file nhỏ thành file lớn hơn (compaction) — dữ liệu ghi liên tục (đặc biệt qua streaming) tạo ra rất nhiều file nhỏ, làm chậm truy vấn vì overhead mở file.
  • Z-ORDER (OPTIMIZE table ZORDER BY (col)): sắp xếp lại dữ liệu vật lý theo cột hay được lọc, giúp Spark bỏ qua (skip) nhiều file không liên quan khi truy vấn có điều kiện WHERE trên cột đó.
  • Liquid Clustering: kỹ thuật mới thay thế dần Z-order/partitioning truyền thống — tự động quản lý cách tổ chức dữ liệu vật lý mà không cần chọn cột partition cố định ngay từ đầu (vốn khó đổi sau này), thích ứng linh hoạt hơn khi pattern truy vấn thay đổi theo thời gian. Khuyến nghị dùng Liquid Clustering cho bảng mới thay vì partition truyền thống trừ khi có lý do đặc thù.
  • VACUUM: xoá vĩnh viễn các file dữ liệu cũ không còn được tham chiếu bởi version nào (sau khi đã quá thời gian lưu giữ, mặc định 7 ngày) — cần chạy định kỳ để tiết kiệm chi phí lưu trữ, nhưng làm mất khả năng Time Travel về các version cũ hơn mốc đã vacuum.

MERGE INTO — Upsert & xử lý CDC

Thao tác quan trọng bậc nhất cho pipeline Silver/Gold: hợp nhất dữ liệu thay đổi (insert/update/delete) từ nguồn vào bảng đích trong một transaction duy nhất — nền tảng để xử lý Change Data Capture (CDC) từ hệ quản trị CSDL nguồn (ví dụ đồng bộ từ MySQL/PostgreSQL của hệ thống Laravel sang lakehouse):

MERGE INTO silver.customers AS target
USING staging.customers_cdc AS source
ON target.customer_id = source.customer_id
WHEN MATCHED AND source.op_type = 'DELETE' THEN DELETE
WHEN MATCHED THEN UPDATE SET *
WHEN NOT MATCHED THEN INSERT *;

🏋️ Bài tập thực hành

Thực hành vòng đời một bảng Delta

Tạo 1 bảng Delta từ dataset mẫu, thực hiện vài lần UPDATE/DELETE, dùng DESCRIBE HISTORY để xem lại lịch sử, và dùng Time Travel truy vấn lại phiên bản trước khi UPDATE. Nạp thêm dữ liệu nhiều lần nhỏ để tạo ra nhiều file nhỏ, sau đó chạy OPTIMIZE ZORDER BY và so sánh thời gian truy vấn có điều kiện WHERE trước/sau. Viết 1 câu MERGE INTO mô phỏng đồng bộ CDC từ bảng "staging" vào bảng "silver".

📚 Tài nguyên học tập

✅ Tự đánh giá hoàn thành

  • Giải thích được transaction log mang lại ACID cho object storage bằng cách nào
  • Dùng thành thạo Time Travel để truy vấn/khôi phục dữ liệu
  • Biết khi nào chạy OPTIMIZE/Z-ORDER/VACUUM và vì sao
  • Viết được câu lệnh MERGE INTO xử lý upsert đúng