Snapshots & Seeds trong dbt: lưu lịch sử thay đổi & nạp danh mục
Ngoài model, dbt còn hai công cụ nhỏ mà rất hữu ích: snapshots (lưu lịch sử thay đổi) và seeds (nạp bảng danh mục từ CSV).
Snapshots — “lúc đó giá trị là gì?”
Phần tiêu đề “Snapshots — “lúc đó giá trị là gì?””Nhiều bảng nguồn bị ghi đè: trạng thái đơn đổi từ “mới” → “đã giao”, hạng khách đổi từ “Bạc” → “Vàng”. Bảng nguồn chỉ giữ giá trị hiện tại — lịch sử mất sạch. Nhưng phân tích lại hay cần “tại thời điểm đó, giá trị là gì?”.
Snapshot giải quyết: dbt chụp bảng theo thời gian, mỗi lần phát hiện thay đổi thì ghi một phiên bản mới kèm khoảng hiệu lực — đây chính là Slowly Changing Dimension type 2 (SCD2).
-- snapshots/snap_khach_hang.sql{% snapshot snap_khach_hang %}{{ config( target_schema='snapshots', unique_key='khach_hang_id', strategy='check', check_cols=['hang_thanh_vien', 'trang_thai']) }}select * from {{ source('shop', 'customers') }}{% endsnapshot %}Mỗi lần dbt snapshot chạy, nếu hang_thanh_vien/trang_thai đổi, dbt thêm dòng mới với dbt_valid_from / dbt_valid_to.
| Chiến lược | Cách phát hiện thay đổi |
|---|---|
timestamp | Dựa vào cột thời gian cập nhật (vd updated_at) — nhẹ, chính xác |
check | So sánh giá trị các cột chỉ định (check_cols) — khi nguồn không có cột thời gian |
Seeds — nạp CSV thành bảng
Phần tiêu đề “Seeds — nạp CSV thành bảng”Seed là file CSV nhỏ đặt trong seeds/, dbt nạp thành bảng khi chạy dbt seed. Hợp cho dữ liệu tĩnh, ít đổi mà bạn muốn quản bằng Git:
- Bảng mapping mã (mã tỉnh ↔ tên tỉnh, mã ngành ↔ nhóm ngành).
- Danh mục phân loại, ngưỡng, tỷ giá cố định.
- Bảng tra cứu nhỏ phục vụ join trong model.
seeds/tinh_thanh.csvma_tinh,ten_tinh,vungHCM,TP. Hồ Chí Minh,NamHN,Hà Nội,BắcTham chiếu seed trong model bằng ref('tinh_thanh') như mọi model khác.