Thiết lập dự án dbt của bạn
Thông thường, dbt chạy trên các kho dữ liệu đám mây như Snowflake hoặc Google BigQuery. Tuy nhiên, để đơn giản cho hướng dẫn này, chúng ta sẽ kết nối tới một cơ sở dữ liệu DuckDB cục bộ.
1. Yêu cầu tiên quyết
- Cài đặt Python trên máy nếu bạn chưa cài.
2. Cài đặt các công cụ cần thiết
Dùng pip để cài dbt CLI:
pip install dbt-core
Cài DuckDB bằng pip:
pip install duckdb
Cài adapter DuckDB bằng pip:
pip install dbt-duckdb
3. Khởi tạo dự án dbt
Tạo một dự án dbt mới:
dbt init project_name
Lệnh này sẽ tạo dự án trong thư mục hiện tại của bạn, có cấu trúc như sau:
project_name/
├── analyses/
├── logs/
├── macros/
├── models/
├── seeds/
├── snapshots/
├── tests/
├── .gitignore
├── dbt_project.yml
4. Thiết lập kết nối DuckDB
Chỉnh sửa file profiles.yml, thường nằm trong thư mục ~/.dbt/. Nếu chưa có, hãy tạo mới:
project_name: # This matches the name in dbt_project.yml file
target: dev
outputs:
dev:
type: duckdb
path: path/to/demo_database.duckdb
threads: 1
File profiles.yml chứa trỏ tới vị trí file cơ sở dữ liệu .duckdb, bạn cần chỉ định trong path.
Bạn có thể tạo cơ sở dữ liệu mới hoặc tải một mẫu nhỏ từ đây. Trong phần tiếp theo, tôi sẽ dùng file duckdb-demo.duckdb từ cùng nguồn.
Để tạo file cơ sở dữ liệu duckDB mới, chỉ cần chạy:
import duckdb
duckdb.connect('/path/to/your/duckdb/database.duckdb')
5. Kiểm tra kết nối
Giờ chúng ta có thể chạy dbt debug để kiểm tra mọi thứ hoạt động. Hãy chắc chắn bạn đang ở thư mục dự án trước khi chạy lệnh:
cd /path/to/your/project/
dbt debug
Nếu mọi thứ được thiết lập đúng, bạn sẽ thấy kết quả tương tự (mọi đường dẫn đã được ẩn vì lý do riêng tư):
15:20:00 Running with dbt=1.9.1
15:20:00 dbt version: 1.9.1
15:20:00 python version: 3.11.5
15:20:00 python path: ...
15:20:00 os info: Windows-10-10.0.22631-SP0
15:20:00 Using profiles dir at ....
15:20:00 Using profiles.yml file at ...
15:20:00 Using dbt_project.yml file at ...
15:20:00 adapter type: duckdb
15:20:00 adapter version: 1.9.1
15:20:00 Configuration:
15:20:00 profiles.yml file [OK found and valid]
15:20:00 dbt_project.yml file [OK found and valid]
15:20:00 Required dependencies:
15:20:00 - git [OK found]
15:20:00 Connection:
15:20:00 database: demo_database
15:20:00 schema: main
15:20:00 path: ...
15:20:00 config_options: None
15:20:00 extensions: None
15:20:00 settings: {}
15:20:00 external_root: .
15:20:00 use_credential_provider: None
15:20:00 attach: None
15:20:00 filesystems: None
15:20:00 remote: None
15:20:00 plugins: None
15:20:00 disable_transactions: False
15:20:00 Registered adapter: duckdb=1.9.1
15:20:01 Connection test: [OK connection ok]
Tạo Lớp Ngữ nghĩa với dbt
Chúc mừng bạn đã đi đến đây! Bạn đã thiết lập thành công dự án dbt đầu tiên.
Giờ hãy xem cách tạo lớp ngữ nghĩa trên một cơ sở dữ liệu. Để làm điều đó, bạn có thể nhập dữ liệu của riêng bạn từ CSV vào DuckDB hoặc tải một file cơ sở dữ liệu mẫu nhỏ (5MB) từ đây.
Sau đó, chúng ta có thể viết một script Python đơn giản để khám phá file cơ sở dữ liệu này chứa gì:
import duckdb
# Connect to the database
conn = duckdb.connect("duckdb-demo.duckdb")
# Get list of tables
tables = conn.execute(
"SELECT table_name FROM information_schema.tables WHERE table_schema='main'"
).fetchall()
print(f"\nNumber of tables in database: {len(tables)}")
print("Table names:")
for t in tables:
print(f"- {t[0]}")
print("\nTables in database:")
for table in tables:
print(f"- {table[0]}")
# Get schema for each table
schema = conn.execute(f"DESCRIBE {table[0]}").fetchall()
print("\nSchema:")
for col in schema:
print(f" {col[0]}: {col[1]}")
# Preview data
data = conn.execute(f"SELECT * FROM {table[0]} LIMIT 5").fetchall()
print("\nFirst 5 rows:")
for row in data:
print(f" {row}")
print("\n---")
# Close connection
conn.close()
Kết quả (rút gọn):
Number of tables in database: 17
Table names:
- bank_failures
- boxplot
- calendar
- ...
Tables in database:
- bank_failures
Schema:
c1: BIGINT
Bank: VARCHAR
City: VARCHAR
State: VARCHAR
Date: DATE
Acquired by: VARCHAR
Assets ($mil.): DOUBLE
First 5 rows:
(1, 'Douglass National Bank', 'Kansas City', 'Missouri', datetime.date(2008, 1, 25), 'Liberty Bank and Trust', 58.5)
(2, 'Hume Bank', 'Hume', 'Missouri', datetime.date(2008, 3, 7), 'Security Bank', 18.7)
...
…
Cơ sở dữ liệu này có 17 bảng. Tuy nhiên, trong hướng dẫn này, chúng ta chỉ dùng bảng bank_failures. Bảng này chứa chi tiết tài chính lịch sử của các ngân hàng thất bại ở Mỹ.
1. Định nghĩa các model SQL
Các model SQL là nền tảng của mọi dự án dbt. Chúng biểu diễn các phép biến đổi có cấu trúc từ dữ liệu thô sang định dạng phục vụ phân tích.
Trong hướng dẫn này, chúng ta sẽ định nghĩa hai file SQL trong thư mục models/.
Tạo file mới trong thư mục models của dự án tên base_bank_failures.sql:
SELECT *
FROM bank_failures
File này lấy trực tiếp dữ liệu thô từ bảng bank_failures. Nó đóng vai trò model nền tảng để các model tiếp theo tham chiếu.
Sau đó, tạo file khác tên clean_bank_failures.sql:
SELECT
State,
COUNT(*) AS total_failures,
SUM("Assets ($mil.)" ) AS total_assets
FROM
{{ ref('base_bank_failures') }}
GROUP BY
State
File này xây dựng dựa trên model base_bank_failures (dùng hàm ref()) để tổng hợp và làm sạch dữ liệu, chuẩn bị cho phân tích. Nó tóm tắt tổng số lần thất bại và tổng tài sản theo bang.
2. Tạo file metrics.yml
File metrics.yml định nghĩa các chỉ số tập trung, có thể tái sử dụng, đảm bảo tính nhất quán trên phân tích và dashboard.
Trong trường hợp của chúng ta, file sẽ mô tả các chỉ số như total_assets và avg_assets_per_failure, giúp chúng sẵn sàng sử dụng trong công cụ BI và truy vấn khác:
version: 2
models:
- name: clean_bank_failures
description: "Aggregated data about bank failures."
columns:
- name: State
tests:
- unique
- name: "Assets ($mil.)"
metrics:
- name: total_assets
label: Total Assets
type: sum
expression: "Assets ($mil.)"
description: "Total assets of failed banks, aggregated by state."
- name: avg_assets_per_failure
label: Average Assets per Failure
type: average
expression: "Assets ($mil.)"
description: "Average assets for each bank failure."
3. Tạo file exposures.yml
File exposures.yml liên kết các mô hình dbt với công cụ bên ngoài như Tableau hoặc Looker. Nó ghi lại các kết nối này, đảm bảo khả năng truy vết và tính nhất quán.
File này chỉ rõ model clean_bank_failures được dùng trong một dashboard Tableau, cung cấp chi tiết về chủ sở hữu và phụ thuộc:
exposures:
- name: tableau_dashboard
type: dashboard
url: https://tableau.yourcompany.com/workbook
owner:
name: Data Team
email: datateam@yourcompany.com
depends_on:
- ref('clean_bank_failures')
Xây dựng và Kiểm thử Lớp Ngữ nghĩa
Để xác thực và xây dựng dự án dbt, dưới đây là một số lệnh hữu ích bạn có thể dùng:
1. Build các model: Chạy lệnh dbt build để materialize tất cả model, áp dụng test, và thực thi seeds và snapshots. Lệnh này kết hợp chức năng của dbt run và dbt test:
dbt build
2. Kiểm thử các model: Nếu bạn chỉ muốn xác thực dữ liệu bằng test sau khi build, hãy dùng lệnh dbt test. Lệnh này đảm bảo tất cả bài kiểm tra chất lượng dữ liệu (ví dụ: kiểm tra tính duy nhất và không-null) được áp dụng cho model của bạn.
dbt test
3. Chạy model hoặc test cụ thể: Để chỉ chạy một số model hoặc test, cung cấp tên của chúng làm đối số. Ví dụ, để chạy một model:
dbt run --select clean_bank_failures
Để kiểm thử một cột cụ thể:
dbt test --select clean_bank_failures.State
Tích hợp Lớp Ngữ nghĩa với Công cụ BI
Để kết nối dbt với các công cụ BI như Looker hoặc Tableau, hãy làm theo các bước sau để expose lớp ngữ nghĩa hiệu quả và đảm bảo công cụ BI có thể tham chiếu trực tiếp đến model và chỉ số của dbt:
1. Bật exposures trong dbt
Trong dự án dbt, tạo file exposures.yml dưới thư mục models với nội dung như sau:
exposures:
- name: tableau_dashboard
type: dashboard
url: https://tableau.yourcompany.com/workbook
owner:
name: Your Name
email: email@yourcompany.com
depends_on:
- ref('clean_bank_failures')
2. Chuẩn bị kết nối cơ sở dữ liệu
- Đảm bảo các model dữ liệu đã được biến đổi sẵn có trong cơ sở dữ liệu của bạn (ví dụ: Snowflake, BigQuery, DuckDB).
- Chạy
dbt buildđể materialize các model dbt vào cơ sở dữ liệu.
3. Kết nối Tableau với các model dbt
- Mở Tableau Desktop và tạo kết nối mới tới cơ sở dữ liệu của bạn.
- Chọn schema nơi lưu trữ các model dbt.
- Kéo thả các model dbt (ví dụ:
clean_bank_failures) vào không gian làm việc của Tableau.
4. Định nghĩa chỉ số trong Tableau
- Trong Tableau, sử dụng trực tiếp các chỉ số do dbt định nghĩa như
total_assetshoặcavg_assets_per_failuretrong trực quan hóa để đảm bảo tính nhất quán. - Tạo các trường tính toán nếu cần để nâng cao trực quan hóa.
5. Kết nối Looker với các model dbt
- Trong Looker, vào trang quản trị và thiết lập kết nối tới cơ sở dữ liệu của bạn.
- Tạo LookML view cho mỗi model dbt bằng cách nhập schema và các trường.
- Sử dụng các chỉ số
total_assetshoặcavg_assets_per_failuređược định nghĩa trong dbt để xây dựng các Explore và dashboard Looker nhất quán.
Thực tiễn tốt nhất khi triển khai Lớp Ngữ nghĩa với dbt
Giờ bạn đã có cái nhìn tổng quan về các bước xây dựng lớp ngữ nghĩa với dbt, hãy điểm qua một số thực tiễn tốt nhất.
Tập trung hóa logic nghiệp vụ
Định nghĩa tất cả quy tắc nghiệp vụ trong dbt để đảm bảo tính nhất quán và dễ bảo trì. Bằng cách tập trung hóa logic nghiệp vụ, bạn loại bỏ định nghĩa trùng lặp trên các công cụ, tạo một nguồn sự thật duy nhất mà tất cả bên liên quan có thể dễ dàng cập nhật và hiểu.
Mô-đun hóa các model
Chia nhỏ các phép biến đổi thành các thành phần logic, có thể tái sử dụng. Ví dụ, tạo model nền cho dữ liệu thô, model trung gian cho dữ liệu đã làm sạch và biến đổi, và model cuối cùng cho dữ liệu sẵn sàng phân tích.
Cấu trúc mô-đun này giúp đơn giản hóa xử lý sự cố, thúc đẩy tái sử dụng mã, và cho phép cộng tác khi các thành viên có thể làm việc trên từng thành phần mà không làm gián đoạn toàn bộ pipeline.
Ghi tài liệu đầy đủ
Tận dụng tính năng tài liệu tự động của dbt để giữ cho lớp ngữ nghĩa của bạn được tổ chức tốt và minh bạch.
Dùng mô tả trong các file YAML để cung cấp giải thích rõ ràng cho model, chỉ số và cột.
Cập nhật tài liệu thường xuyên để phản ánh thay đổi và sử dụng đồ thị lineage tự động của dbt để hình dung mối quan hệ giữa các model. Điều này đảm bảo lớp ngữ nghĩa luôn dễ truy cập và điều hướng cho mọi người dùng.
Các công cụ như gói dbt-utils có thể tối ưu đáng kể quy trình dbt của bạn, cung cấp macro và tiện ích dựng sẵn giúp đơn giản hóa phát triển model và đảm bảo tài liệu hóa đầy đủ.
Kết luận
Triển khai lớp ngữ nghĩa với dbt là một cách tiếp cận mạnh mẽ để thu hẹp khoảng cách giữa dữ liệu thô và insight có thể hành động. Mô hình hóa dữ liệu theo mô-đun, định nghĩa chỉ số tập trung, kiểm soát phiên bản mạnh và khả năng tích hợp với công cụ BI của dbt giúp bạn đảm bảo dữ liệu nhất quán, đáng tin cậy và dễ tiếp cận cho phân tích và báo cáo.
Hướng dẫn này đã đưa bạn qua các bước thiết lập dự án dbt, tạo model SQL, định nghĩa chỉ số tái sử dụng, và tích hợp lớp ngữ nghĩa với công cụ trực quan hóa như Tableau và Looker.
Để tìm hiểu thêm về dbt, hãy xem khóa học tuyệt vời Introduction to dbt!

Nhiều công ty hiện đại dựa vào lớp ngữ nghĩa để thu hẹp khoảng cách giữa dữ liệu thô lưu trữ trong kho dữ liệu như Snowflake và các insight trong bảng điều khiển hoặc báo cáo.
Lớp ngữ nghĩa là một lớp trừu tượng định nghĩa các chỉ số, thước đo và chiều dữ liệu nhất quán cho phân tích và báo cáo.
Trong hướng dẫn này, chúng ta sẽ khám phá cách triển khai lớp ngữ nghĩa bằng dbt (data build tool), một khung chuyển đổi và mô hình hóa dữ liệu phổ biến. Tài liệu này bao gồm các ví dụ thực tế và góc nhìn giúp bạn nắm vững khái niệm.
Lớp ngữ nghĩa là gì và vì sao quan trọng?
Lớp ngữ nghĩa chuyển đổi dữ liệu thô thành các chỉ số và chiều dữ liệu có thể tái sử dụng, nhất quán, giúp đơn giản hóa phân tích dữ liệu. Đây là công cụ duy trì sự thống nhất giữa các đội và công cụ.
Lợi ích của lớp ngữ nghĩa
Vì sao dbt lý tưởng để xây dựng lớp ngữ nghĩa
Hãy xem điều gì khiến dbt trở thành công cụ hoàn hảo giúp kỹ sư dữ liệu và phân tích xây dựng lớp ngữ nghĩa.
Sơ đồ khái niệm Lớp Ngữ nghĩa dbt, nhờ dbt Labs
Mô hình hóa dữ liệu theo mô-đun
dbt cho phép bạn chia nhỏ các phép biến đổi dữ liệu phức tạp thành các mô hình tái sử dụng, dạng mô-đun. Các mô hình này có thể được xếp tầng theo phân cấp, nơi các mô hình dữ liệu nền tảng cung cấp đầu vào cho mô hình phân tích cấp cao hơn.
Cách tiếp cận này giúp pipeline dễ bảo trì và cho phép các đội cộng tác hiệu quả hơn bằng cách cô lập thay đổi trong các mô hình cụ thể mà không ảnh hưởng đến toàn hệ thống.
Để tìm hiểu thêm về các khái niệm nền tảng và thực tiễn tốt nhất của dbt cho mô hình hóa dữ liệu, hãy xem Hướng dẫn dbt: 7 Khái niệm Cần Biết cho Kỹ sư Dữ liệu. Tài liệu này cung cấp các góc nhìn bổ trợ cho chiến lược trình bày ở đây.
Định nghĩa chỉ số tập trung
Với dbt, logic nghiệp vụ và các chỉ số được định nghĩa tập trung tại một nơi, đảm bảo tính nhất quán trên nhiều công cụ phân tích. Bằng tính năng metrics của dbt, bạn có thể định nghĩa KPI như doanh thu, tỷ lệ chuyển đổi hoặc churn một lần và dùng chúng trên dashboard, báo cáo, phân tích mà không cần định nghĩa lại. Điều này giảm sai lệch và đảm bảo toàn vẹn dữ liệu.
Kiểm soát phiên bản và tài liệu hóa
Tích hợp của dbt với Git hỗ trợ kiểm soát phiên bản mạnh mẽ, cho phép bạn theo dõi và kiểm tra thay đổi theo thời gian. Kết hợp với tài liệu tự động sinh, dbt tạo ra một tài liệu sống, dễ truy cập cho tất cả các phép biến đổi và chỉ số. Điều này mang lại tính minh bạch và giúp thành viên mới nhanh chóng hòa nhập bằng cách khám phá pipeline dữ liệu đã được ghi chú.
Tích hợp với công cụ BI
dbt hoạt động với các nền tảng BI như Looker, Tableau và Mode, cho phép tích hợp lớp ngữ nghĩa vào công cụ trực quan hóa. Sử dụng exposures của dbt, bạn có thể liên kết trực tiếp các mô hình dbt với dashboard BI, đảm bảo mọi cập nhật trong mô hình dữ liệu được phản ánh vào phân tích mà không cần can thiệp thủ công.