Làm chủ dbt Core với PostgreSQL: Từ SQL ‘rời rạc’ đến quy trình Data chuẩn chỉnh

Database tutorial - IT technology blog
Database tutorial - IT technology blog

Ám ảnh mang tên “SQL thủ công”

Bạn đã bao giờ rơi vào cảnh “bơi” giữa 50 file SQL dài dằng dặc, cái nằm ở máy cá nhân, cái trôi dạt trên server chưa? Mỗi khi logic tính doanh thu thay đổi, bạn lại phải lục tìm từng file, chạy tay từng lệnh và cầu nguyện mình không copy-paste nhầm chỗ.

Sau nhiều năm làm việc với PostgreSQL và MongoDB, mình nhận ra quản lý logic biến đổi dữ liệu (Transformation) bằng script thuần là một sai lầm về bảo trì. dbt (data build tool) ra đời để giải quyết bài toán này. Nó mang tư duy của một kỹ sư phần mềm vào thế giới của Data Analyst với: Quản lý phiên bản (Git), Testing và Documentation tự động.

Trong mô hình ELT (Extract – Load – Transform), dbt sẽ đảm nhận chữ T. Khi dữ liệu thô đã nằm yên vị trong PostgreSQL, dbt sẽ nhào nặn chúng thành những bảng dữ liệu sạch sẽ, sẵn sàng cho việc lên dashboard.

Cài đặt dbt Core và kết nối PostgreSQL

Để bắt đầu, máy bạn cần cài sẵn Python (khuyên dùng bản 3.8 trở lên). dbt Core hoàn toàn miễn phí, chạy qua dòng lệnh (CLI) nên cực kỳ nhẹ.

1. Cài đặt thư viện dbt-postgres

Đừng cài bản dbt chung chung. Hãy cài adapter riêng cho PostgreSQL để đạt hiệu suất tốt nhất:

pip install dbt-postgres

Sau đó, hãy gõ dbt --version. Nếu hiện ra thông tin phiên bản, bạn đã đi đúng hướng.

2. Khởi tạo dự án

Mở terminal tại thư mục làm việc và chạy:

dbt init my_first_dbt_project

dbt sẽ hỏi bạn các thông số như host, port, user. Nếu chưa rõ, bạn cứ nhấn Enter, chúng ta sẽ cấu hình chi tiết ở bước tiếp theo.

Cấu hình kết nối an toàn qua profiles.yml

Dbt mặc định lưu thông tin kết nối tại ~/.dbt/profiles.yml chứ không để trong thư mục dự án. Cách làm này giúp bảo mật thông tin tối đa. Bạn sẽ không bao giờ lo việc vô tình đẩy mật khẩu database lên GitHub.

Dưới đây là cấu hình chuẩn cho môi trường local:

my_first_dbt_project:
  outputs:
    dev:
      type: postgres
      threads: 4 # Số lượng model chạy song song
      host: localhost
      port: 5432
      user: postgres_user
      pass: your_password
      dbname: analytics_db
      schema: dbt_transformation
  target: dev

Mẹo nhỏ: Hãy tách biệt schema raw (dữ liệu thô) và analytics (dữ liệu đã xử lý). Việc phân tách này giúp bạn quản lý quyền truy cập dễ dàng: Data Analyst chỉ cần quyền xem ở schema analytics là đủ.

Viết Model đầu tiên: Biến SELECT thành Table

Trong thế giới dbt, mỗi file .sql là một Model. Bạn không cần viết CREATE TABLE hay DROP VIEW rườm rà. Chỉ cần viết câu lệnh SELECT, dbt sẽ lo phần việc nặng nhọc còn lại.

Ví dụ, để tính tổng chi tiêu của khách hàng, hãy tạo file models/marts/customer_orders.sql:

with orders as (
    select * from {{ source('raw', 'orders') }}
),

final as (
    select
        customer_id,
        count(order_id) as total_orders,
        sum(amount) as total_spent
    from orders
    group by 1
)

select * from final

Hàm {{ source(...) }} chính là chìa khóa. Nó giúp dbt xây dựng biểu đồ phụ thuộc (Lineage). Nếu bảng A cần dữ liệu từ bảng B, dbt sẽ tự động chạy bảng B trước mà không cần bạn can thiệp.

Để thực thi, bạn chỉ cần gõ duy nhất một lệnh: dbt run.

Kiểm tra chất lượng dữ liệu (Data Testing)

Bạn sợ dữ liệu bị trùng hay cột ID bị Null? Thay vì viết script check tay, hãy khai báo trong file schema.yml. dbt sẽ tự động hóa việc kiểm định này.

version: 2

models:
  - name: customer_orders
    columns:
      - name: customer_id
        tests:
          - unique
          - not_null
      - name: status
        tests:
          - accepted_values:
              values: ['placed', 'shipped', 'completed', 'returned']

Khi chạy dbt test, hệ thống sẽ quét toàn bộ database. Nếu phát hiện một dòng dữ liệu vi phạm, dbt sẽ cảnh báo ngay lập tức. Điều này đảm bảo báo cáo bạn gửi cho sếp luôn chính xác 100%.

Tự động hóa Documentation

Nỗi sợ của mọi Analyst là phải làm việc với một database “lạ hoắc” mà không có mô tả cột. dbt giải quyết triệt để vấn đề này bằng cách tự sinh ra một trang web tài liệu chuyên nghiệp.

Chỉ cần hai lệnh:

dbt docs generate
dbt docs serve

Một giao diện web sẽ hiện ra, hiển thị toàn bộ cấu trúc bảng và Lineage Graph. Đây là sơ đồ trực quan cho thấy dữ liệu chảy từ đâu đến đâu. Khi đồng nghiệp hỏi về logic, bạn chỉ cần gửi một đường link là xong.

Vận hành và Giám sát

Khi hệ thống lớn dần với hàng trăm model, việc gõ lệnh tay không còn hiệu quả. Bạn nên tích hợp dbt vào các công cụ lập lịch như Airflow hoặc GitHub Actions.

Mỗi lượt chạy, dbt sẽ xuất ra các file JSON trong thư mục target/. Bạn có thể tận dụng run_results.json để đẩy log vào Grafana. Cách này giúp bạn theo dõi thời gian chạy và phát hiện lỗi kịp thời trước khi người dùng báo cáo.

Lời khuyên cuối: Đừng vội vàng chuyển toàn bộ SQL cũ sang dbt trong một ngày. Hãy bắt đầu với những bảng quan trọng nhất, thiết lập vài bài test cơ bản. Bạn sẽ thấy hiệu quả kiểm soát dữ liệu thay đổi rõ rệt chỉ sau 1-2 tuần áp dụng.

Share: