Bỏ qua để đến nội dung

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).

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ượcCách phát hiện thay đổi
timestampDựa vào cột thời gian cập nhật (vd updated_at) — nhẹ, chính xác
checkSo sánh giá trị các cột chỉ định (check_cols) — khi nguồn không có cột thời gian

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.csv
ma_tinh,ten_tinh,vung
HCM,TP. Hồ Chí Minh,Nam
HN,Hà Nội,Bắc

Tham chiếu seed trong model bằng ref('tinh_thanh') như mọi model khác.

Chia sẻ: