Chuỗi: lakehouse-glossary · Phần 3
Năng suất & công cụ dev
Schema evolution và enforcement trong Lakehouse
Schema evolution và enforcement: thay đổi cấu trúc bảng an toàn, mergeSchema, enforceSchema. Hỗ trợ Delta, Iceberg, Hudi và best practices.
2026-03-173 phút đọcVI
Chuỗi: lakehouse-glossary
- 1.Delta Lake / Apache Iceberg / Apache Hudi — Định dạng bảng cho Lakehouse
- 2.Data versioning và time travel trong Lakehouse
- 3.Schema evolution và enforcement trong Lakehouse(bài này)
- 4.Tối ưu định dạng file – Parquet, Delta, Z-Ordering
- 5.Compaction và chiến lược quản lý file
- 6.Tối ưu bảng và chiến lược clustering
- 7.Định dạng bảng và quản lý metadata
- 8.Governance — Data catalog, lineage, kiểm soát truy cập
- 9.Security – Mã hóa, masking, tokenization
- 10.Metadata – Metadata store, lineage, discovery
- 11.Change Data Capture (CDC) trong Lakehouse
1. Khái niệm
- Schema Evolution là khả năng thay đổi cấu trúc bảng dữ liệu mà vẫn giữ được khả năng truy xuất và xử lý.
- Schema Enforcement là cơ chế ràng buộc dữ liệu đầu vào phải tuân thủ định nghĩa schema hiện tại (ví dụ: đúng kiểu dữ liệu, đúng trường bắt buộc).
2. Vì sao quan trọng?
- Hệ thống data hiện đại luôn thay đổi: thêm cột, đổi kiểu, chuyển enum → string,...
- Nếu không có schema management → hệ thống dễ gãy, dữ liệu bị "bể schema", không xử lý được downstream
3. Cơ chế hoạt động trong Lakehouse
| Cơ chế | Delta Lake | Apache Iceberg | Apache Hudi |
|---|---|---|---|
| Add column | Hỗ trợ | Hỗ trợ | Hỗ trợ |
| Rename / Drop column | Không chuẩn, cần recreate | Hỗ trợ tốt (metadata-based) | Một phần (dùng timeline) |
| Type promotion (int→long) | Có thể cấu hình | Linh hoạt | Có |
| Enforcement on write | Strict/Permissive mode | Hỗ trợ | Hỗ trợ |
4. Thực hành với Delta Lake
# Ghi dữ liệu với schema ban đầu
df1 = spark.createDataFrame([(1, "Alice")], ["id", "name"])
df1.write.format("delta").save("/lake/user")
# Ghi dữ liệu với schema mới – thêm cột 'email'
df2 = spark.createDataFrame([(2, "Bob", "bob@email.com")], ["id", "name", "email"])
df2.write.format("delta") \
.option("mergeSchema", "true") \
.mode("append") \
.save("/lake/user")
# Đọc lại → Schema tự động mở rộng
df = spark.read.format("delta").load("/lake/user")
df.printSchema()5. Case Study – Sai sót phổ biến
| Tình huống | Hậu quả |
|---|---|
Ghi dữ liệu kiểu int vào trường string | Spark lỗi "Cannot safely cast" |
Bỏ cột email nhưng không cập nhật schema | Cột bị null toàn bộ → lỗi khi downstream |
Cập nhật enum → string mà không kiểm tra | Lỗi mapping downstream logic |
6. Use cases
- Khoa học dữ liệu thêm nhiều feature vào bảng training → cần mergeSchema
- Hệ thống CRM thay đổi định dạng thông tin khách hàng (zip → city)
- Dự án A/B test thêm nhiều trường tạm, cần schema flex
7. Schema Enforcement Mode
| Option | Ý nghĩa |
|---|---|
enforceSchema=true | Dữ liệu ghi sai schema sẽ bị từ chối |
mergeSchema=true | Tự động mở rộng schema khi ghi mới |
strict mode | Chặn ghi thiếu field, sai type |
8. Kiến nghị triển khai
| Thành phần | Đề xuất kỹ thuật |
|---|---|
| Ingestion Layer | Kiểm tra schema trước khi insert vào Staging |
| Lakehouse Table | Bật mergeSchema nhưng có kiểm duyệt field mới |
| Metadata Store | Gắn version schema theo từng commit |
| Alert | Gửi cảnh báo nếu phát hiện mismatch lớn |
9. Hành động tiếp theo
- Audit toàn bộ bảng Delta hiện có → ghi nhận schema hiện tại
- Thử ghi các batch mới với schema thay đổi → test rollback
- Thiết lập schema registry (dùng JSON schema + validation layer)
- Gắn version schema theo ngày để debug và audit
- Thiết kế pipeline hợp lệ hóa schema cho raw → staging → silver
