Chuyển đến nội dung chính

dbt Snapshot: Hướng dẫn toàn diện

Tìm hiểu dbt snapshot là gì, cách tạo và cấu hình để theo dõi các thay đổi dữ liệu trong hướng dẫn này.
· 9 phút đọc

Khám phá cùng AI

dbt (data build tool) là một công cụ mạnh mẽ được các nhà phân tích và kỹ sư dữ liệu sử dụng để biến đổi, kiểm thử và ghi tài liệu dữ liệu trong bộ công cụ dữ liệu hiện đại. 

Bên cạnh khả năng mô hình hóa nổi tiếng, một tính năng quan trọng khác là dbt snapshot, cho phép bạn ghi nhận các chiều thay đổi chậm (SCD) trong kho dữ liệu.

Hướng dẫn này sẽ giải thích chi tiết về dbt snapshots, các trường hợp sử dụng và cách triển khai. Tôi sẽ:

  • Định nghĩa dbt snapshots là gì.
  • Giải thích khi nào và vì sao nên dùng snapshots.
  • Triển khai snapshot từng bước.
  • Trực quan hóa dữ liệu snapshot.
  • Chia sẻ một số thực tiễn tốt và thách thức.

Để tìm hiểu thêm về dbt, hãy xem hướng dẫn dbt là gì? Giới thiệu thực hành cho Kỹ sư Dữ liệu và khóa học Giới thiệu về dbt.  

dbt Snapshots là gì?

Một dbt snapshot là cơ chế theo dõi thay đổi của các bản ghi theo thời gian, đặc biệt với các bảng mà mặc định không lưu lịch sử thay đổi. Snapshots chủ yếu được dùng để triển khai Slowly Changing Dimensions (SCD) Loại 2. Chúng lưu các phiên bản của hàng khi các cột được theo dõi thay đổi. 

Trường hợp sử dụng gồm:

  • Theo dõi thay đổi hồ sơ khách hàng theo thời gian.
  • Giám sát thay đổi trạng thái trong dữ liệu vận hành.
  • Ghi nhận sự phát triển của thuộc tính chiều để báo cáo lịch sử chính xác.

Vì sao dùng dbt Snapshots? Lợi ích và Trường hợp sử dụng

dbt snapshots hữu ích vì chúng hoạt động như một bản ghi các thay đổi dữ liệu theo thời gian, cho phép phân tích lịch sử và báo cáo tuân thủ.

Lợi ích

Dưới đây là một số lợi ích khi dùng Snapshots:

  • Phân tích xu hướng: Hiểu hành vi, thuộc tính hoặc trạng thái của khách hàng thay đổi như thế nào.
  • Kiểm toán & tuân thủ: Chứng minh trạng thái dữ liệu lịch sử cho kiểm toán viên hoặc cơ quan quản lý.
  • Gỡ lỗi pipeline dữ liệu: Xác định thời điểm một bản ghi thay đổi bất ngờ để truy vết sự cố.

Trường hợp sử dụng phổ biến

Snapshots hữu ích trong một số tình huống đặc thù như:

  • Theo dõi nâng hạng thành viên trong các chương trình khách hàng thân thiết.
  • Ghi lịch sử giá cho sản phẩm bán lẻ.
  • Ghi nhận thay đổi phòng ban của nhân viên trong hệ thống HR.

Nền tảng kiến trúc

Snapshots tích hợp mượt mà trong hệ sinh thái của dbt, tận dụng cấu hình và quản lý chạy để xây dựng bảng lịch sử hiệu quả.

Hãy xem các loại mô hình được dùng cho dữ liệu làm ví dụ.

Có hai loại mô hình dùng cho dữ liệu:

  • Mô hình tiêu chuẩn: Biến đổi dữ liệu để tạo các bảng trạng thái hiện tại.
  • Mô hình snapshot: Tạo bảng phiên bản để theo dõi thay đổi lịch sử.

Hai mô hình này khác nhau ở mục đích, phương thức lưu trữ và ứng dụng.

Tóm tắt khác biệt của chúng:

Tính năng

Mô hình tiêu chuẩn

Snapshots

Mục đích

Biến đổi trạng thái hiện tại

Theo dõi lịch sử

Lưu trữ

Bảng hoặc view với dữ liệu hiện tại

Bảng lịch sử chỉ thêm (append-only)

Phù hợp nhất cho

Mô hình fact/chiều

Chiều thay đổi chậm

dbt Snapshots hoạt động như thế nào

Snapshots thường tuân theo một quy trình có cấu trúc để đảm bảo mọi thay đổi được ghi nhận một cách hệ thống, gồm các bước sau:

  1. Cấu hình: Xác định chiến lược snapshot, khóa duy nhất và các cột phát hiện thay đổi.
  2. Thực thi: Chạy dbt snapshot để so sánh dữ liệu hiện tại với snapshot đã có.
  3. Lưu trữ: dbt chèn bản ghi mới cho các thay đổi được phát hiện, cập nhật dấu thời gian hiệu lực.

Vậy dbt theo dõi thay đổi như thế nào?

Mọi thay đổi đều được ghi trong bảng Snapshot đầu ra.

Nếu phát hiện thay đổi, dbt cập nhật trường dbt_valid_to của phiên bản trước bằng thời gian hiện tại và chèn một hàng mới với trường dbt_valid_from là thời gian hiện tại.

Chiến lược Snapshot trong dbt

Snapshots dùng hai chiến lược chính để phát hiện thay đổi.

1. Chiến lược theo dấu thời gian (Timestamp)

  • Định nghĩa: Dùng một trường dấu thời gian để phát hiện thay đổi.
  • Khi nào dùng: Bảng nguồn có cột updated_at tin cậy.

2. Chiến lược kiểm tra (Check)

  • Định nghĩa: So sánh trực tiếp các cột chỉ định.
  • Khi nào dùng: Bảng nguồn không có dấu thời gian tin cậy nhưng cần theo dõi thay đổi thuộc tính.

Chiến lược

Phương pháp phát hiện

Phù hợp nhất cho

Timestamp

Cột dấu thời gian cập nhật

Bảng có dấu thời gian sửa đổi cuối cùng đáng tin cậy

Check

So sánh trực tiếp các cột

Bảng không có cột dấu thời gian

Xóa cứng (Hard Deletes)

Các thay đổi dữ liệu như xóa cũng có thể được theo dõi, nhưng không phải mặc định. Tuy nhiên, có cách để thay đổi điều đó nhằm giám sát các lần xóa cứng.

  • Vấn đề: Mặc định, snapshots không theo dõi các hàng bị xóa.
  • Giải pháp: Đặt invalidate_hard_deletes=True để đánh dấu các hàng bị xóa bằng giá trị dbt_valid_to, lưu lại trạng thái cuối cùng của chúng.

Ví dụ về triển khai chiến lược check, đồng thời tính đến xóa cứng:

{%
  snapshot customers_snapshot %}

{%
  set config(
    target_schema='snapshots',
    unique_key='customer_id',
    strategy='check',
    check_cols=['tier'],
    invalidate_hard_deletes=True
  )
%}

SELECT * FROM {{ source('customers') }}

{% endsnapshot %}

Hướng dẫn triển khai dbt Snapshots

Giờ chúng ta đã hiểu cách dbt Snapshots hoạt động, hãy xem cách triển khai chúng 

1. Bộ dữ liệu mẫu cho hướng dẫn Snapshot

Để thực hành snapshots, chúng ta sẽ tạo một bảng khách hàng mẫu mô phỏng hệ thống thành viên thực tế. Điều này cung cấp dữ liệu cụ thể để thử các chiến lược snapshot phổ biến.

import csv
from datetime import datetime

# Define the data
customers_data = [
    ["customer_id", "name", "tier", "updated_at"],  # header row
    [1, "Alice Tan", "Silver", "2025-07-01 10:00:00"],
    [2, "Bob Lee", "Gold", "2025-07-01 10:00:00"],
    [3, "Cheryl Lim", "Silver", "2025-07-01 10:00:00"]
]

# Write data to customers.csv
with open("customers.csv", mode="w", newline="", encoding="utf-8") as file:
    writer = csv.writer(file)
    writer.writerows(customers_data)

2. Thiết lập dự án dbt của bạn

Trước khi triển khai snapshots, điều quan trọng là thiết lập đúng dự án dbt của bạn. Điều này đảm bảo môi trường được cấu hình để quản lý mô hình, snapshot, kiểm thử và tài liệu theo cách có cấu trúc, có khả năng mở rộng.

Điều kiện tiên quyết

  • Đảm bảo bạn đã cài Python 3.7+.
  • Cài dbt bằng pip:
pip install dbt

Thay dbt-postgres bằng adapter kho dữ liệu của bạn, ví dụ dbt-snowflake hoặc dbt-bigquery, tùy môi trường.

Hướng dẫn thiết lập từng bước

1. Điều hướng tới thư mục dự án mong muốn.

Đây là nơi bạn sẽ lưu trữ các dự án phân tích hoặc ELT. Trong ví dụ này, chúng ta sẽ lưu mọi tệp liên quan trong thư mục dự án dbt này.

cd ~/dbt-snapshot-project

2. Khởi tạo một dự án dbt mới.

Tạo tệp cấu hình tên là dbt_project.yml:

Dán nội dung sau vào tệp dự án của bạn:

name: dbt_snapshots_project
version: '1.0'
profile: austinchia

seeds:
  dbt_snapshots_project:
    +quote_columns: false

3. Kiểm tra kết nối của bạn.

dbt debug

Kết quả lệnh sẽ như sau:

đầu ra dbt debug

4. Nạp seeds vào cơ sở dữ liệu cục bộ.

Chạy lệnh sau:

dbt seed

Kết quả lệnh sẽ như sau:

đầu ra dbt seed

5. Cấu hình thiết lập kết nối cơ sở dữ liệu của bạn

Trong tệp profiles.yml, thường nằm tại ~/.dbt/profiles.yml.

Nội dung trong tệp profiles của tôi như sau:

austinchia:
  target: dev
  outputs:
    dev:
      type: sqlite
      threads: 1
      database: ./dbt_snapshots_project.db
      schema: main
      schema_directory: ./schemas
      schemas_and_paths:
        main: ./dbt_snapshots_project.db
      extensions:
        - "C:/sqlean/crypto.dll"

Nếu bạn dùng cơ sở dữ liệu SQLite như tôi, bạn cũng sẽ cần cài tiện ích mở rộng SQLean.

6. Nạp dữ liệu vào các mô hình staging của dbt:

Tạo một thư mục mới tên models. Trong thư mục đó, tạo tệp stg_customers.sql.

Dán đoạn mã sau vào tệp:

SELECT
  *
FROM {{ ref('customers') }}

7. Xây dựng mô hình staging bằng lệnh sau trong dbt.

dbt run --select stg_customers

Kết quả lệnh sẽ như sau:

đầu ra staging của dbt

3. Cấu hình dbt Snapshot

  1. Tạo thư mục snapshots/.
  2. Viết tệp SQL snapshot với cấu hình phù hợp.

Trong ví dụ này, bạn có thể dùng đoạn mã sau để thực hiện snapshot theo chiến lược timestamp.

{% snapshot customers_snapshot %}

{{
  config(
    target_schema='snapshots',
    unique_key='customer_id',
    strategy='timestamp',
    updated_at='updated_at'
  )
}}

select * from {{ ref('customers') }}

{% endsnapshot %}

4. Chạy dbt Snapshot

Thực thi:

dbt snapshot

Với lệnh này, dbt tạo bảng snapshot nếu chưa tồn tại. Nó cũng chèn các hàng mới cho những thay đổi được phát hiện.

Kết quả lệnh sẽ như sau:

đầu ra dbt snapshot

5. Kiểm tra các bảng Snapshot

Sau khi thực hiện snapshot, bạn sẽ có tệp snapshot.db mới được tạo trong thư mục dự án.

Tôi đã mở tệp này trong VSCode để xem nó trông như thế nào:

bảng snapshot

Như bạn thấy, nó chứa các cột bổ sung như dbt_updated_at… Đây là các cột quan trọng để xác định có thay đổi dữ liệu hay không và khi nào thay đổi.

Để có thêm hướng dẫn thực hành về dbt, hãy xem hướng dẫn Lớp ngữ nghĩa với dbt.

Ví dụ: Theo dõi thay đổi dữ liệu với dbt Snapshots

Snapshots cho phép các nhóm ghi nhận đầy đủ dấu vết kiểm toán về thay đổi của bất kỳ thuộc tính nào trong một bảng theo thời gian, rất hữu ích cho tuân thủ, gỡ lỗi và phân tích.

  1. Tạo bảng mẫu customers với các trường liên quan. Bao gồm ID khách hàng, tên, email và dấu thời gian updated_at để theo dõi thời điểm xảy ra thay đổi.
CREATE TABLE customers (
    customer_id INTEGER PRIMARY KEY,
    name VARCHAR(100),
    email VARCHAR(100),
    updated_at TIMESTAMP
);
  1. Chèn dữ liệu ban đầu để mô phỏng trạng thái cơ sở.

Dùng đoạn mã sau để chèn dữ liệu vào bảng. Dữ liệu này dùng làm dữ liệu gốc trước khi thay đổi.

INSERT INTO customers VALUES 
(1, 'Alice Tan', '[email protected]', '2025-07-01 10:00:00'),
(2, 'Bob Lee', '[email protected]', '2025-07-01 10:00:00');
  1. Viết cấu hình dbt snapshot để theo dõi thay đổi email:
{% snapshot customers_email_snapshot %}

{%
  set config(
    target_schema='snapshots',
    unique_key='customer_id',
    strategy='check',
    check_cols=['email'],
    invalidate_hard_deletes=True
  )
%}

SELECT * FROM {{ source('customers') }}

{% endsnapshot %}
  1. Chạy dbt snapshot để ghi nhận trạng thái ban đầu.
dbt snapshot
  1. Mô phỏng cập nhật email trong bảng nguồn.

Tiếp theo, chúng ta sẽ cập nhật bảng gốc bằng cách sửa thông tin một khách hàng để mô phỏng thay đổi dữ liệu.

UPDATE customers
SET email = '[email protected]', updated_at = '2025-07-02 09:00:00'
WHERE customer_id = 1;
  1. Chạy dbt snapshot lần nữa để ghi nhận thay đổi.
dbt snapshot
  1. Truy vấn bảng snapshot.

Để xem sự khác biệt và các thay đổi đã thực hiện, bạn cần truy vấn bảng snapshot. Bảng sẽ hiển thị cả hai phiên bản địa chỉ email với khoảng thời gian hiệu lực tương ứng:

SELECT customer_id, email, dbt_valid_from, dbt_valid_to
FROM snapshots.customers_email_snapshot
ORDER BY customer_id, dbt_valid_from;

Quy trình này đảm bảo bạn giữ lại toàn bộ lịch sử thay đổi cho cập nhật email, rất quan trọng cho kiểm toán GDPR, theo dõi lịch sử liên hệ hoặc phân tích hỗ trợ khách hàng.

Cấu hình và quản lý nâng cao

Quản lý cấu hình hiệu quả cho phép các nhóm mở rộng triển khai snapshot trên nhiều dự án và môi trường một cách liền mạch.

1. Cấu hình cấp dự án và cấp tài nguyên

  • Cấu hình cấp dự án: Dùng dbt_project.yml để đặt cấu hình snapshot mặc định, như schema đích hoặc materialization, áp dụng cho tất cả snapshots.
  • Cấu hình cấp tài nguyên: Ghi đè thiết lập trong từng tệp SQL snapshot cho các yêu cầu cụ thể, đảm bảo sự linh hoạt.

2. Tùy chỉnh các trường siêu dữ liệu

Theo mặc định, dbt tạo các trường dbt_valid_from và dbt_valid_to. Bạn có thể đổi tên chúng bằng tùy chọn cấu hình valid_from và valid_to nếu tiêu chuẩn nhóm yêu cầu quy ước đặt tên khác để rõ ràng trong công cụ BI hoặc quản trị dữ liệu.

3. Di chuyển cấu hình Snapshot cũ

Việc di chuyển có thể gây sai lệch nếu không xử lý đúng. Dưới đây là một số điểm cần lưu ý khi bạn di chuyển cấu hình snapshot:

  1. Xác định các định nghĩa snapshot cũ sử dụng kiểu khối cấu hình đã ngừng hỗ trợ.
  2. Tái cấu trúc sang cấu hình dựa trên YAML nếu dùng phiên bản dbt hiện đại để thống nhất.
  3. Xác thực tính đúng đắn:
    • Chạy snapshots trên môi trường thử nghiệm.
    • So sánh đầu ra trước khi ngừng sử dụng snapshots cũ.
  4. Ngừng sử dụng: Xóa các tệp snapshot cũ và điều chỉnh tài liệu tương ứng.

4. Tích hợp với các công cụ khác

Các thay đổi dữ liệu có thể được theo dõi đồng bộ với dbt snapshots. 

Ví dụ:

  • Công cụ BI (ví dụ, Power BI, Tableau): Xây dựng hình ảnh hóa theo thời gian thể hiện thay đổi thuộc tính theo thời gian.
  • Nền tảng quan sát (ví dụ, Monte Carlo, Datafold): Giám sát độ mới và tính toàn vẹn lịch sử của dữ liệu.
  • Danh mục dữ liệu (ví dụ, Alation, Collibra): Bao gồm các bảng lịch sử snapshot như các hiện vật phả hệ được ghi tài liệu để phục vụ tuân thủ.

Thực tiễn tốt nhất khi triển khai sản xuất

Triển khai dbt snapshots trong môi trường sản xuất cần thiết kế cẩn thận để đảm bảo hiệu năng, khả năng bảo trì và giá trị kinh doanh.

Nên tuân theo những điều sau:

1. Trường hợp sử dụng tối ưu và chọn bảng

  • Ưu tiên các bảng chiều có thuộc tính thay đổi chậm như hồ sơ khách hàng, dữ liệu sản phẩm gốc và hợp đồng nhà cung cấp.
  • Tránh các bảng giao dịch (ví dụ, dòng đơn hàng) có tần suất chèn và cập nhật cao trừ khi cần thiết do lo ngại tăng trưởng lưu trữ nhanh.

2. Kỹ thuật tối ưu hiệu năng

Trong sản xuất, bạn sẽ muốn tối ưu để theo dõi thay đổi dữ liệu hiệu quả mà không ảnh hưởng đến sản phẩm.

Một số mẹo:

  • Đánh chỉ mục: Thêm index trên unique_key và các cột hiệu lực để truy vấn nhanh hơn.
  • Phân vùng: Phân vùng bảng snapshot theo ngày để tối ưu hiệu năng quét.
  • Clustering (phụ thuộc kho dữ liệu): Dùng khóa clustering (ví dụ trong BigQuery) trên các trường có độ phân biệt cao để cải thiện tốc độ lọc.

3. Thực hành bảo trì và giám sát

  • Lên lịch: Chạy snapshots vào giờ thấp điểm để giảm chi phí tính toán.
  • Giám sát: Thiết lập cảnh báo lỗi snapshot trong dbt Cloud hoặc công cụ điều phối của bạn.
  • Kiểm tra độ mới dữ liệu: Dùng kiểm thử dbt hoặc công cụ quan sát để xác thực độ mới của dữ liệu snapshot.
  • Phân tích lưu trữ: Định kỳ xem xét kích thước bảng snapshot và cắt tỉa dữ liệu lịch sử nếu phù hợp với yêu cầu kinh doanh.

4. Cạm bẫy thường gặp

Dùng unique_key không duy nhất dẫn đến phiên bản hóa hàng không chính xác. Luôn kiểm thử tính duy nhất trước khi triển khai. 

Hiện tượng phình to snapshot cũng có thể xảy ra khi lưu trữ những thay đổi lịch sử không cần thiết (ví dụ, các cột cập nhật dấu thời gian thường xuyên) có thể làm chi phí lưu trữ tăng nhanh.

Thách thức phổ biến và giải pháp

Việc dùng Snapshots trong dbt có thể đi kèm một số thách thức kỹ thuật cụ thể:

1. Va chạm khóa duy nhất

Vấn đề: Hàng trùng lặp trong snapshot do khóa duy nhất được định nghĩa kém.

Giải pháp:

  • Xác thực tính duy nhất bằng kiểm thử dbt trước khi triển khai snapshot.
  • Nối nhiều trường để đảm bảo tính duy nhất tổng hợp khi cần.

2. Hiệu năng truy vấn theo thời gian

Vấn đề: Truy vấn chậm khi phân tích dữ liệu lịch sử.

Giải pháp:

  • Sử dụng hiệu quả phân vùng và clustering của kho dữ liệu.
  • Luôn lọc truy vấn theo dbt_valid_from hoặc khoảng ngày để giảm lượng dữ liệu quét.

3. Khắc phục lỗi thực thi Snapshot

Các vấn đề thường gặp gồm:

  • Quyền truy cập schema hoặc cơ sở dữ liệu không đúng.
  • Thay đổi lược đồ bảng nguồn (ví dụ bỏ cột) làm hỏng câu lệnh SELECT của snapshot.
  • Lỗi cú pháp trong các khối cấu hình snapshot.

Giải pháp:

  • Dùng dbt debug để xác thực kết nối và cấu hình.
  • Triển khai kiểm thử CI trong dbt để phát hiện lỗi trước khi triển khai.
  • Xem nhật ký chạy dbt để có thông điệp lỗi chi tiết.

Kết luận

dbt snapshots giúp các nhóm phân tích xây dựng bộ dữ liệu lịch sử vững chắc với chi phí kỹ thuật tối thiểu, hỗ trợ phân tích tuân thủ. Nếu bạn muốn tìm hiểu thêm về dbt, hãy xem khóa học Giới thiệu về dbt. Để đọc thêm và xem nhiều hướng dẫn khác, hãy tham khảo Giới thiệu gói dbt-utils và Hướng dẫn dbt.

dbt Snapshot FAQs

Làm thế nào để cấu hình dbt snapshots cho các chiến lược dữ liệu khác nhau?

Để cấu hình dbt snapshots cho các chiến lược dữ liệu khác nhau, bạn chọn giữa chiến lược timestamp và check trong cấu hình snapshot. Với chiến lược timestamp, chỉ định strategy='timestamp' và cung cấp cột updated_at cập nhật tin cậy khi có bất kỳ thay đổi nào. Với chiến lược check, dùng strategy='check' và định nghĩa check_cols với danh sách các cột cần theo dõi thay đổi.

Thực tiễn tốt nhất để lên lịch dbt snapshots là gì?

Lên lịch snapshots vào giờ thấp điểm, điều chỉnh tần suất theo tốc độ thay đổi dữ liệu, dùng công cụ điều phối như Airflow hoặc dbt Cloud, chạy tách biệt với các phép biến đổi nặng và thường xuyên giám sát lỗi.

Làm sao tôi có thể tùy chỉnh các trường siêu dữ liệu trong dbt snapshots?

Bạn có thể đổi tên các trường siêu dữ liệu mặc định như dbt_valid_from và dbt_valid_to trong cấu hình snapshot, và thêm siêu dữ liệu tùy chỉnh bằng cấu hình meta trong YAML để phù hợp với tiêu chuẩn dữ liệu của bạn.

Sự khác biệt giữa chiến lược timestamp và check trong dbt snapshots là gì?

Timestamp dùng cột updated_at để phát hiện mọi thay đổi, trong khi check so sánh các cột cụ thể; timestamp đơn giản hơn, còn check linh hoạt hơn khi không có dấu thời gian tin cậy.

Xử lý các bản ghi bị xóa trong dbt snapshots như thế nào?

Dùng invalidate_hard_deletes=True để dbt đánh dấu các bản ghi bị thiếu bằng ngày kết thúc trong khoảng hiệu lực của chúng, qua đó ghi nhận việc xóa trong lịch sử snapshot.

Austin Chia

Tác giả

Austin Chia

Tôi là Austin, một blogger và cây bút công nghệ với nhiều năm kinh nghiệm làm nhà khoa học dữ liệu và nhà phân tích dữ liệu trong lĩnh vực chăm sóc sức khỏe. Khởi đầu hành trình công nghệ với nền tảng sinh học, tôi hiện hỗ trợ những người khác thực hiện chuyển đổi tương tự thông qua blog công nghệ của mình. Niềm đam mê công nghệ đã đưa tôi đến với việc cộng tác viết cho hàng chục công ty SaaS, truyền cảm hứng cho người khác và chia sẻ trải nghiệm của bản thân.

Chủ đề

Liên quan