DBT là gì? Tìm hiểu Công cụ Transform trong Data Engineering
24 Sep, 2025
Hướng nội
AuthorDBT (Data Build Tool) là một công cụ mã nguồn mở giúp Data Engineers và Data Analysts thực hiện bước Transform trong quy trình ELT

Mục Lục
Data Engineering không chỉ là việc di chuyển dữ liệu — mà còn là việc biến đổi dữ liệu thô thành những insights có giá trị. Nhưng làm thế nào để xây dựng một quy trình transform dữ liệu minh bạch, dễ bảo trì và có thể mở rộng? DBT có thể là câu trả lời cho vấn đề này, hãy cùng mình tìm hiểu chi tiết về DBT và thực hành một Demo nho nhỏ Phân tích Doanh thu Cửa hàng Cà phê nhé!
1. DBT là gì?
DBT (Data Build Tool) là một công cụ mã nguồn mở giúp Data Engineers và Data Analysts thực hiện bước Transform (biến đổi dữ liệu) trong quy trình ELT (Extract, Load, Transform).
Nó cho phép bạn biến đổi dữ liệu thô trong kho dữ liệu (data warehouse) thành các bảng và mô hình dữ liệu sẵn sàng để phân tích, bằng cách sử dụng SQL thuần túy kết hợp với jinja templating để tạo ra các pipeline modular, có thể kiểm thử và tái sử dụng.
2. Tại sao DBT ra đời?
Trước khi DBT xuất hiện, quy trình transform dữ liệu thường gặp những vấn đề sau:
- SQL scripts rời rạc, khó bảo trì: Các file SQL nối tiếp nhau, không có cấu trúc rõ ràng, khó theo dõi dependency.
- Thiếu testing: Dữ liệu sau transform thường không được kiểm tra chất lượng (ví dụ: unique, not null, …).
- Khó version control & collaboration: SQL scripts thường nằm trong các file riêng lẻ, khó review code, khó tích hợp với Git.
- Documentation thiếu hoặc không đồng bộ: Metadata của bảng và cột thường không được ghi chú đầy đủ, gây khó khăn khi onboarding hoặc tra cứu.
👉 DBT ra đời để giải quyết tất cả những vấn đề trên, biến quá trình transform từ “thủ công và rời rạc” thành “tự động, có cấu trúc và đáng tin cậy”.
Ví dụ: Bạn cần xây dựng một bảng monthly_customer_summary từ hai bảng raw:raw_orders, raw_customers
- Với cách làm truyền thống:
transform_orders.sql,transform_customers.sql,build_summary.sql, bạn sẽ gặp phải các vấn đề sau:- Phải chạy từng file theo đúng thứ tự (nếu không sẽ lỗi).
- Không có cơ chế tự động kiểm tra chất lượng dữ liệu.
- Không có documentation.
- Khó theo dõi logic transform khi dự án phức tạp lên.
-- transform_orders.sql
CREATE OR REPLACE TABLE staging_orders AS
SELECT
id AS order_id,
customer_id,
order_date,
amount
FROM raw_orders;
-- transform_customers.sql
CREATE OR REPLACE TABLE staging_customers AS
SELECT
id AS customer_id,
first_name,
last_name
FROM raw_customers;
-- build_summary.sql
CREATE OR REPLACE TABLE monthly_customer_summary AS
SELECT
c.customer_id,
c.first_name,
c.last_name,
EXTRACT(MONTH FROM o.order_date) AS month,
SUM(o.amount) AS total_amount
FROM staging_customers c
JOIN staging_orders o ON c.customer_id = o.customer_id
GROUP BY 1,2,3,4;
- Cách làm hiện đại với DBT:
models/staging/stg_orders.sql,models/staging/stg_customers.sql,models/marts/monthly_customer_summary.sql,models/staging/schema.yml. với câu lệnh dbt run, DBT sẽ tự động:- Hiểu dependency giữa các models (dùng
ref()) - Tạo các models theo đúng thứ tự
- Kiểm tra chất lượng dữ liệu với test cases đã định nghĩa
- Generate document tự động
- Hiểu dependency giữa các models (dùng
-- models/staging/stg_orders.sql
{{
config(
materialized='view'
)
}}
SELECT
id AS order_id,
customer_id,
order_date,
amount
FROM {{ source('raw', 'raw_orders') }}
-- models/staging/stg_customers.sql
{{
config(
materialized='view'
)
}}
SELECT
id AS customer_id,
first_name,
last_name
FROM {{ source('raw', 'raw_customers') }}
-- models/marts/monthly_customer_summary.sql
{{
config(
materialized='table'
)
}}
SELECT
c.customer_id,
c.first_name,
c.last_name,
EXTRACT(MONTH FROM o.order_date) AS month,
SUM(o.amount) AS total_amount
FROM {{ ref('stg_customers') }} c
JOIN {{ ref('stg_orders') }} o ON c.customer_id = o.customer_id
GROUP BY 1,2,3,4
# models/staging/schema.yml
version: 2
models:
- name: stg_orders
columns:
- name: order_id
tests:
- unique
- not_null
- name: stg_customers
columns:
- name: customer_id
tests:
- unique
- not_null
DBT giúp chuyển đổi từ một quy trình thủ công, rời rạc, dễ lỗi sang một quy trình tự động, có cấu trúc, minh bạch và dễ bảo trì. Đây chính là lý do tại sao DBT ra đời và nhanh chóng trở thành công cụ không thể thiếu trong Data Engineering hiện đại.
3. DBT đóng vai trò gì đối với Data Engineer?
DBT thực sự là một framework giúp Data Engineer xây dựng các data pipeline một cách có hệ thống, tin cậy và dễ bảo trì. Dưới đây là những vai trò chính của DBT trong công việc hàng ngày của một Data Engineer:
- SQL-Based Transformation: Cho phép viết logic biến đổi dữ liệu hoàn toàn bằng SQL, giúp cả Data Engineers và Data Analysts dễ dàng tham gia vào quá trình phát triển.
- Modular & Reusable Code: Sử dụng hàm
ref()để tham chiếu giữa các model, đảm bảo các dependency được quản lý rõ ràng, tránh lỗi khi thay đổi hoặc mở rộng. - Testing & Data Quality: Tích hợp sẵn cơ chế testing giúp kiểm tra dữ liệu đầu ra (ví dụ: unique, not null, relationship giữa các bảng) một cách tự động.
- Documentation Auto-Generation: Tự động tạo document từ code và comments, giúp dự án minh bạch, dễ tra cứu và onboarding thành viên mới.
- Version Control Ready: Toàn bộ code được lưu trữ trong Git, hỗ trợ review code, collaboration và rollback một cách hiệu quả.
- Deployment & Orchestration: Dễ dàng tích hợp với các công cụ orchestration như Airflow, Dagster, hoặc sử dụng dbt Cloud để lập lịch chạy pipeline.
4 Hướng dẫn cài đặt và Sử dụng BDT cơ bản
4.1 Hướng dẫn cài đặt DBT và Setup Project
Yêu cầu:
- Python 3.8+
pip(công cụ quản lý package của Python)
Bạn sẽ cài đặt 2 package chính:dbt-core và adapter cho kho dữ liệu của bạn. Adapter là một plugin cho phép dbt giao tiếp với một kho dữ liệu cụ thể (BigQuery, Snowflake, Postgres...).
Mở terminal của bạn và chạy lệnh (ví dụ với Google BigQuery). Nếu bạn dùng Snowflake, hãy thay dbt-bigquery bằng dbt-snowflake. Tương tự với dbt-redshift, dbt-postgres...
pip install dbt-core dbt-bigquery
Sau khi cài đặt xong, hãy tạo một dự án dbt mới bằng lệnh dbt init:
dbt init my_first_dbt_project
cd my_first_dbt_project
dbt sẽ hỏi bạn một vài câu hỏi để thiết lập. Sau khi hoàn tất, nó sẽ tạo ra một cấu trúc thư mục chuẩn. Thư mục my_first_dbt_project của bạn sẽ trông như thế này:
my_first_dbt_project/
├── dbt_project.yml -- File cấu hình chính của dự án
├── models/ -- Nơi chứa các file .sql (models)
│ └── example/
├── seeds/ -- Nơi chứa các file CSV tĩnh
├── tests/ -- Nơi chứa các bài test tùy chỉnh
├── README.md
...
Kết nối tới Kho dữ liệu (Data Warehouse): Đây là bước quan trọng nhất. dbt cần biết cách kết nối tới kho dữ liệu, thông tin này được lưu trong fileprofiles.yml. Đây là một ví dụ về file profiles.yml để kết nối tới Google BigQuery:
# ~/.dbt/profiles.yml
my_first_dbt_project: # Tên profile, phải khớp với tên trong dbt_project.yml
target: dev
outputs:
dev:
type: bigquery
method: service-account # Phương thức xác thực
project: your-gcp-project-id # ID dự án Google Cloud của bạn
dataset: dbt_your_name # Dataset mà dbt sẽ tạo bảng trong đó
threads: 4
keyfile: /path/to/your/service-account.json # Đường dẫn tới file key
Sau khi cấu hình xong, hãy kiểm tra kết nối bằng lệnh dbt debug, nếu thấy thông báo All checks passed! thì xem như đã thành công rồi đó
4.2 Demo: Phân tích Doanh thu Cửa hàng Cà phê
4.2.1 Chuẩn bị dữ liệu nguồn (dbt seed)
Để demo, chúng ta sẽ sử dụng một tính năng của dbt làseed, nó cho phép bạn tải các file CSV tĩnh vào kho dữ liệu.
- Tạo file
seeds/cafe_products.csv:
product_id,product_name,price
1,Espresso,45000
2,Latte,55000
3,Cappuccino,55000
4,Americano,50000
- Tạo file
seeds/cafe_orders.csv:
order_id,product_id,order_timestamp
101,1,"2025-09-24 08:15:00"
102,2,"2025-09-24 08:17:00"
103,4,"2025-09-24 09:05:00"
104,2,"2025-09-24 09:30:00"
105,3,"2025-09-25 10:00:00"
106,1,"2025-09-25 10:02:00"
- Bây giờ, hãy chạy lệnh
dbt seedđể tải 2 file CSV này lên BigQuery. dbt sẽ tạo 2 bảngcafe_productsvàcafe_orderstrong dataset của bạn.
4.2.2 Xây dựng Staging Models
Staging model dùng để làm sạch và chuẩn hóa dữ liệu từ nguồn. Hãy xóa thư mục models/example mặc định đi và tạo các file sau:
-- models/staging/stg_products.sql
SELECT
product_id,
product_name,
price
FROM
{{ ref('cafe_products') }}
-- models/staging/stg_orders.sql
SELECT
order_id,
product_id,
CAST(order_timestamp AS DATE) AS order_date
FROM
{{ ref('cafe_orders') }}
Lưu ý: {{ ref('tên_bảng') }} là cách dbt tham chiếu đến các model hoặc seed khác, nó giúp dbt tự động xây dựng cây dependency.
4.2.3 Xây dựng DataMart Model
Đây là model cuối cùng, phục vụ cho việc phân tích, tạo file models/marts/daily_sales.sql:
WITH orders AS (
SELECT * FROM {{ ref('stg_orders') }}
),
products AS (
SELECT * FROM {{ ref('stg_products') }}
)
SELECT
o.order_date,
p.product_name,
COUNT(o.order_id) AS number_of_orders,
SUM(p.price) AS total_revenue
FROM
orders o
LEFT JOIN
products p ON o.product_id = p.product_id
GROUP BY
1, 2
ORDER BY
1, 2
Model này sẽ join dữ liệu đơn hàng và sản phẩm, sau đó tính toán tổng doanh thu theo ngày và theo sản phẩm.
4.2.4 Thêm Tests và Tài liệu
Tạo filemodels/staging/schema.yml để định nghĩa các bài test và mô tả:
version: 2
models:
- name: stg_products
description: "Dữ liệu sản phẩm của cửa hàng cà phê."
columns:
- name: product_id
description: "Khóa chính của sản phẩm."
tests:
- unique
- not_null
- name: stg_orders
description: "Dữ liệu đơn hàng đã được làm sạch."
columns:
- name: order_id
description: "Khóa chính của đơn hàng."
tests:
- unique
- not_null
4.2.5 Chạy - Kiểm tra - Tạo Document
Giờ là lúc xem thành quả, bạn chạy lệnh dbt run, dbt sẽ thực thi 3 model bạn đã tạo (stg_products, stg_orders, daily_sales) theo đúng thứ tự phụ thuộc.
Chạy các bài test bằng lệnh dbt test, dbt sẽ kiểm tra xem các cột product_id và order_id có thực sự là duy nhất và không null hay không.
Nếu cả hai lệnh đều chạy thành công, bạn đã xây dựng thành công pipeline dữ liệu đầu tiên của mình! Bảng daily_sales giờ đã tồn tại trong kho dữ liệu của bạn, sẵn sàng để được truy vấn hoặc đưa lên dashboard.
Cuối cùng bạn chạy 2 lệnh sau dbt docs generate, dbt docs serve, dbt sẽ tạo ra một trang web tài liệu và mở nó trong trình duyệt của bạn. Tại đây, bạn có thể xem tất cả các model, các cột, các test case và quan trọng nhất là lineage graph trực quan, cho thấy daily_sales được xây dựng từ đâu.
5 Kết luận
Thật đơn giản phải không? Chỉ với các file SQL và vài lệnh đơn giản, bạn đã xây dựng được một pipeline dữ liệu hoàn chỉnh, có kiểm thử, có tài liệu và dễ dàng bảo trì. Chúc các bạn thực hành thành công!
DBT không chỉ là một công cụ — mà là một tư duy mới trong việc xây dựng data pipeline. Nó giúp biến quy trình transform từ một công việc thủ công, rời rạc thành một hệ thống có cấu trúc, tự động và đáng tin cậy.