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

Triển khai Lớp Ngữ nghĩa với dbt: Hướng dẫn Thực hành

Tìm hiểu cách xây dựng lớp ngữ nghĩa với dbt, biến dữ liệu thô thành các chỉ số nhất quán cho phân tích và công cụ BI!
· 8 phút đọc

Khám phá cùng AI

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

  • Định nghĩa dữ liệu nhất quán: Đảm bảo các chỉ số kinh doanh như doanh thu, tỷ lệ rời bỏ, tăng trưởng YoY, giá trị đơn hàng trung bình, v.v. được định nghĩa thống nhất. Điều này loại bỏ nhầm lẫn do các đội sử dụng định nghĩa không nhất quán và giúp duy trì niềm tin vào dữ liệu trên toàn tổ chức.
  • Tăng cường hợp tác: Tạo thuận lợi cho giao tiếp và đồng bộ tốt hơn giữa đội ngũ kỹ thuật và phi kỹ thuật. Bằng cách cung cấp một lớp dữ liệu thống nhất, đội kỹ thuật có thể tập trung vào độ chính xác dữ liệu trong khi đội kinh doanh tận dụng các chỉ số rõ ràng, dễ tiếp cận cho quyết định chiến lược.
  • Rút ngắn thời gian ra quyết định: Giảm mơ hồ, cho phép đưa ra quyết định nhanh hơn. Với lớp ngữ nghĩa, các bên liên quan có thể nhanh chóng truy cập và phân tích các chỉ số đáng tin cậy, giảm thiểu thời gian đối soát dữ liệu hoặc xử lý sai lệch.

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.

A screenshot showing architecture of modeling with dbt

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.

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_assets hoặc avg_assets_per_failure trong 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_assets hoặc avg_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!

Moez Ali

Tác giả

Moez Ali

Nhà khoa học dữ liệu, Nhà sáng lập & Người tạo ra PyCaret

Chủ đề

Liên quan