Khóa học
Gói dbt-utils là một bộ công cụ mạnh mẽ giúp đơn giản hóa và tăng cường quy trình chuyển đổi dữ liệu của bạn. Trong hướng dẫn này, chúng tôi sẽ giới thiệu dbt-utils, cho thấy cách nó có thể tinh gọn quy trình làm việc của bạn với các macro dựng sẵn cho những thao tác SQL phổ biến.
dbt-utils là gì?

Gói dbt-utils
dbt-utils là một gói trong dbt cung cấp bộ công cụ gồm các macro dựng sẵn giúp mở rộng chức năng của các dự án dbt. dbt-utils giảm độ phức tạp bằng cách thêm các lớp trừu tượng, cho phép chuyển đổi dữ liệu hiệu quả và nhất quán hơn.
Nếu bạn quen với các thư viện trong Python và các gói trong R, thì gói dbt-utils cũng tương tự như vậy.
Với các macro tiêu chuẩn hóa dùng cho những thao tác SQL (Structured Query Language) phổ biến, dbt-utils đảm bảo bạn không phải tự viết từ đầu mọi phép biến đổi phức tạp.
Tận dụng các tiện ích này giúp bạn tránh “phát minh lại bánh xe” bằng cách tích hợp một bộ macro đã được cộng đồng thẩm định vào dự án, tăng khả năng bảo trì và thúc đẩy văn hóa thực hành tốt.
Các tính năng và chức năng chính
dbt-utils cung cấp nhiều tính năng và chức năng giúp chuyển đổi dữ liệu hiệu quả và tinh gọn hơn. Bao gồm:
1. Macro tiêu chuẩn hóa
dbt-utils cung cấp nhiều macro dựng sẵn cho các thao tác SQL phổ biến bằng mẫu Jinja, như join, tổng hợp, lọc, và hơn thế nữa.
Các macro này được tiêu chuẩn hóa để đảm bảo tính nhất quán giữa các dự án và giảm nhu cầu viết mã lặp lại.
Ví dụ, đây là một số macro thường được kỹ sư phân tích sử dụng:
date_spine: Tạo một dãy ngày liên tục giữa hai mốc ngày xác định, hữu ích cho phân tích chuỗi thời gian.pivot: Chuyển đổi các hàng thành cột một cách linh hoạt, đơn giản hóa thao tác crosstab.star: Lấy tất cả trường từ các bảng được chỉ định trong model, loại trừ những trường trong đối sốexcept.union_relations: Kết hợp dữ liệu từ nhiều quan hệ có cùng cấu trúc bằngunion all.generate_series: Tạo một chuỗi dữ liệu số, hữu ích cho phân tích chuỗi thời gian.surrogate_key: Tạo khóa định danh duy nhất cho từng hàng bằng cách nối nhiều trường.
Với các macro này, SQL có thể thực hiện những tác vụ vốn dĩ phức tạp và lặp đi lặp lại.
2. Hỗ trợ schema và tài liệu
dbt-utils cung cấp công cụ hữu ích để quản lý schema và tài liệu trong các mô hình dữ liệu. Điều này giúp bạn dễ theo dõi thay đổi và duy trì tổ chức trong dự án.
4. Khả năng kiểm thử
Với dbt-utils, người dùng có thể dễ dàng viết kiểm thử để đảm bảo độ chính xác và chất lượng của các phép chuyển đổi dữ liệu. Các bài kiểm thử này có thể tự động hóa và tích hợp vào quy trình CI, giúp pipeline dữ liệu hiệu quả và tin cậy hơn.
Vì sao nên dùng dbt-utils?
Vậy, vì sao nên dùng gói này?
Hãy cùng điểm qua một số lợi ích:
- Đơn giản hóa SQL phức tạp: Nhờ macro, dbt-utils giúp việc viết các truy vấn SQL phức tạp trở nên đơn giản hơn. Điều này tiết kiệm thời gian và công sức cho nhà phân tích và kỹ sư dữ liệu, để họ tập trung vào phân tích ở mức cao thay vì sa đà vào mã.
- Tài liệu hiệu quả: Như đã đề cập, dbt-utils có thể giúp tạo tài liệu tự động.
- Nâng cao kiểm soát chất lượng: Bằng cách tích hợp khả năng kiểm thử vào pipeline dữ liệu, dbt-utils giúp đảm bảo độ chính xác và độ tin cậy của các phép chuyển đổi.
- Tự động hóa xác thực dữ liệu: Với dbt-utils, việc xác thực dữ liệu có thể tự động hóa và tích hợp vào quá trình phát triển. Điều này đảm bảo mọi thay đổi với mô hình dữ liệu đều được xác thực ngay lập tức và các vấn đề tiềm ẩn được phát hiện sớm.
- Mã nguồn mở: dbt-utils là mã nguồn mở, vì vậy nhiều nhà phát triển có thể đóng góp vào quá trình phát triển gói. Điều này đồng nghĩa gói sẽ được cập nhật liên tục.
Cài đặt và Thiết lập dbt-utils
Hãy xem cách đưa gói dbt-utils vào quy trình dữ liệu của bạn dưới đây.
Yêu cầu tiên quyết
Trước khi dùng dbt-utils, bạn cần quen với SQL và nắm được các nền tảng của dbt (data build tool). Bạn nên có sẵn một dự án dbt đã khởi tạo và cấu hình.
Nếu cần ôn lại, bạn có thể xem khóa học Giới thiệu về dbt và hướng dẫn dbt của chúng tôi.
Ngoài ra, cần đảm bảo phiên bản dbt core và gói dbt-utils tương thích. Nên kiểm tra tính tương thích giữa các phiên bản dbt để tránh xung đột hoặc tính năng bị loại bỏ.
Cài đặt từng bước
Để bắt đầu tích hợp dbt-utils vào ngăn xếp dữ liệu của bạn, trước tiên hãy đảm bảo môi trường phát triển đã được thiết lập đúng.
Bước 1: Cài đặt dbt
Đầu tiên, đảm bảo dbt đã được cài trong môi trường của bạn. Bạn có thể cài dbt qua pip:
pip install dbt
Bước 2: Thêm dbt-utils vào dự án dbt của bạn
Để cài dbt-utils, hãy thêm nội dung sau vào tệp packages.yml ở thư mục gốc dự án dbt.

Tạo tệp này ở thư mục gốc dự án dbt nếu chưa có, và thêm nội dung sau:
packages:
- package: dbt-labs/dbt_utils
version: "1.1.1" # Use the latest version compatible with your dbt version
Trong tệp yaml này, bạn cũng sẽ chỉ định phiên bản gói cần thiết. Hãy đảm bảo dùng phiên bản mới nhất tương thích với phiên bản dbt bạn đã cài.
Bước 3: Cài đặt gói
Sau khi chỉnh sửa, việc cài đặt chỉ còn cách một lệnh.
Khi lệnh chạy thành công, nó sẽ tải và cài dbt-utils, sẵn sàng cho các chức năng nâng cao.
Chạy lệnh sau trong terminal tại thư mục dự án dbt của bạn:
dbt deps
Lệnh này sẽ cài tất cả gói được liệt kê trong packages.yml.
Các Tiện ích Chính của dbt-utils và Ứng dụng
Gói dbt-utils cung cấp một bộ các hàm hỗ trợ phổ biến giúp tinh gọn các phép biến đổi SQL trong dự án dbt.
Các hàm này giúp nhà phát triển tránh lặp lại và tập trung vào logic nghiệp vụ riêng.
Dưới đây là một số hàm trong dbt-utils:
1. Trình tạo SQL
Các trình tạo SQL trong dbt-utils hữu ích để tạo mã SQL theo mô-đun.
Ví dụ, macro deduplicate rất tốt để loại bỏ các hàng trùng lặp đồng thời giữ thứ tự dữ liệu. Có thể xóa bản trùng khỏi model, bảng và thậm chí Common Table Expressions (CTE).
2. Kiểm thử tổng quát
Kiểm thử tổng quát dùng để xác thực dữ liệu trong một bảng hoặc view. Chúng có thể tùy biến dễ dàng để phù hợp yêu cầu cụ thể và cung cấp góc nhìn giá trị về chất lượng dữ liệu đang xử lý.
Chẳng hạn, macro expression_is_true kiểm tra xem một biểu thức nhất định có đúng hay không. Có thể dùng linh hoạt để xác minh nhiều điều kiện, như:
- Độ dài cột
- Kết quả của một phép toán đại số cơ bản cụ thể
3. Trợ giúp Jinja
Trợ giúp Jinja hữu ích để tạo truy vấn SQL động có thể dễ dàng tùy biến dựa trên đầu vào người dùng hoặc dữ liệu biến đổi. Chúng cho phép logic điều kiện và vòng lặp trong câu lệnh SQL.
Mẫu Jinja được dùng để định nghĩa và chỉ định các macro này.
Một ví dụ là macro pretty_time, trả về chuỗi timestamp hiện tại.
4. Macro web
Macro web tương tự trợ giúp Jinja, nhưng được thiết kế dành riêng cho các dự án web. Chúng cho phép tạo và thao tác HTML động, giúp việc tạo trang web tương tác và đáp ứng trở nên dễ dàng hơn.
Một macro hữu ích là get_url_path, lấy đường dẫn trang từ URL. Cú pháp như sau:
{{ dbt_utils.get_url_path(field='page_url') }}
5. Macro hướng nội (introspective)
Macro hướng nội là các macro có thể truy cập và thao tác dữ liệu trong phạm vi hiện tại. Điều này cho phép xử lý dữ liệu động và hiệu quả, giảm nhu cầu các hàm hay mã bổ sung.
Một ví dụ là macro get_column_values, trả về kết quả truy vấn dưới dạng đối tượng.
Tình huống sử dụng thực tế của dbt-utils
Tình huống 1: Đơn giản hóa truy vấn phức tạp
Kịch bản ví dụ: Một công ty có bộ dữ liệu lớn chứa thông tin khách hàng, dữ liệu giao dịch và dữ liệu sản phẩm. Họ cần tạo báo cáo hiển thị tổng doanh số cho mỗi danh mục sản phẩm trong quý vừa qua.
Thay vì viết các truy vấn SQL phức tạp để join nhiều bảng và tính doanh số cho từng danh mục, họ có thể dùng dbt-utils để dễ dàng trích xuất dữ liệu liên quan và xử lý trong các macro hoặc model.
Ví dụ, họ có thể dùng get_filtered_columns_in_relation để lọc chỉ các cột cần thiết liên quan đến dữ liệu sản phẩm rồi dùng macro sum để tính tổng doanh số cho mỗi danh mục.
Điều này đơn giản hóa quy trình và giúp hiệu quả hơn, tiết kiệm thời gian và giảm lỗi.
Triển khai mã:
Để triển khai giải pháp này trong một cơ sở dữ liệu giả lập, bạn có thể làm theo các bước sau:
Dùng macro get_filtered_columns_in_relation để chỉ lọc những cột cần thiết từ dữ liệu sản phẩm. Macro này giúp bạn chọn cột liên quan một cách hiệu quả.
-- models/product_data_filtered.sql
with product_data as (
select
{{ dbt_utils.get_filtered_columns_in_relation(
relation=ref('products'),
include=['product_id', 'category']
) }}
from {{ ref('products') }}
)
select * from product_data
Tiếp theo, tạo một model để join dữ liệu sản phẩm, giao dịch và khách hàng. Sau đó dùng hàm sum để tính tổng doanh số cho mỗi danh mục sản phẩm trong quý vừa qua.
-- models/total_sales_by_category.sql
with product_data as (
select
{{ dbt_utils.get_filtered_columns_in_relation(
relation=ref('products'),
include=['product_id', 'category']
) }}
from {{ ref('products') }}
),
transaction_data as (
select
product_id,
sale_amount,
transaction_date
from {{ ref('transactions') }}
where transaction_date >= date_trunc('quarter', current_date) - interval '1 quarter'
),
joined_data as (
select
p.category,
t.sale_amount
from product_data p
join transaction_data t
on p.product_id = t.product_id
)
select
category,
sum(sale_amount) as total_sales
from joined_data
group by category
Sau khi định nghĩa các model, hãy chạy các model dbt để thực thi phép biến đổi và tạo báo cáo.
dbt run
Giải thích mã trên:
Macro get_filtered_columns_in_relation giúp chọn chỉ các cột cần thiết (product_id và category) từ bảng products, đơn giản hóa tập dữ liệu.
Tiếp theo, dữ liệu sản phẩm đã lọc được join với dữ liệu giao dịch bằng SQL để lấy số tiền bán cho từng sản phẩm. Sau đó tính tổng doanh số cho mỗi danh mục sản phẩm trong quý trước bằng hàm tổng hợp sum.
Tình huống 2: Đảm bảo chất lượng dữ liệu với kiểm thử tổng quát
Kịch bản ví dụ:
Trong tình huống này, chúng ta tiếp tục làm việc với bộ dữ liệu giả lập giống Tình huống 1. Tuy nhiên, thay vì tạo báo cáo, mục tiêu là đảm bảo chất lượng dữ liệu bằng cách chạy các kiểm thử tổng quát trên dữ liệu.
Triển khai mã:
Dưới đây là ví dụ cách triển khai các kiểm thử cho bộ dữ liệu của bạn:
1. Kiểm thử tỷ lệ giá trị null
Trong kiểm thử tổng quát này, chúng ta sẽ chỉ chấp nhận các giá trị phù hợp với tỷ lệ không-null do ta chỉ định. Ta sẽ sử dụng kiểm thử not_null_proportion.
# models/products.yml
version: 2
models:
- name: products
columns:
- name: product_id
tests:
- dbt_utils.not_null_proportion:
at_least: 0.95
Trong ví dụ này, chúng ta thêm đối số tùy chọn at_least để đặt tỷ lệ không-null tối thiểu là 0,95.
2. Kiểm thử các trường rỗng
Trong ví dụ này, chúng ta sẽ dùng kiểm thử not_empty_string để kiểm tra chuỗi rỗng trong trường product_id.
# models/products.yml
version: 2
models:
- name: products
columns:
- name: product_id
tests:
- dbt_utils.not_empty_string
3. Kiểm thử toàn vẹn tham chiếu
Sử dụng hàm relationships_where sẽ đảm bảo rằng mọi product_id trong bảng transactions đều tồn tại trong bảng products.
# models/transactions.yml
version: 2
models:
- name: transactions
columns:
- name: product_id
tests:
- dbt_utils.relationships_where:
to: ref('products')
field: product_id
Trong ví dụ này, chúng ta đảm bảo rằng tất cả giá trị product_id trong bảng transactions tương ứng với các bản ghi hợp lệ trong bảng. Đây là một kiểm tra toàn vẹn quan hệ cơ bản.
Lưu ý rằng bạn cũng có thể kết hợp nhiều kiểm thử cùng lúc để bao quát nhiều kiểm tra toàn vẹn.
Khi đã định nghĩa xong các kiểm thử trong tệp cấu hình yaml, hãy dùng lệnh dbt test để chạy tất cả các kiểm thử schema đã định nghĩa.
dbt test
Các Thực hành Tốt với dbt-utils
Khai thác dbt-utils hiệu quả
Khi dùng dbt, điều quan trọng là tuân theo các thực hành tốt để dự án chạy hiệu quả. Với dbt-utils, có một vài điểm then chốt cần lưu ý:
- Kết hợp nhiều kiểm thử thay vì định nghĩa riêng lẻ: Như đã đề cập, bạn có thể kết hợp nhiều kiểm thử trong một câu lệnh kiểm thử duy nhất. Điều này giúp giảm trùng lặp và cải thiện hiệu năng tổng thể của dự án.
- Dùng macro dbt_utils.surrogate_key khi tạo khóa thay thế: Macro này tự động tạo khóa thay thế dựa trên các cột khác trong bảng của bạn, giúp tiết kiệm thời gian và công sức.
Những lỗi thường gặp và cách tránh
Dưới đây là một số lỗi thường gặp khi dùng dbt-utils, kèm mẹo để tránh:
- Không cấu hình đúng các macro tùy chỉnh: Nếu bạn tạo macro tùy chỉnh, hãy đảm bảo chúng được cấu hình và kiểm thử kỹ trước khi đưa vào dự án.
- Không cập nhật lên phiên bản mới nhất của dbt-utils: Việc cập nhật thường xuyên lên phiên bản mới nhất của dbt-utils rất quan trọng để tận dụng tính năng mới và bản sửa lỗi.
Kết luận
dbt-utils là công cụ mạnh mẽ để tinh gọn, kiểm thử và tự động hóa các tác vụ trong quá trình mô hình hóa dữ liệu của bạn. Đây là phần thiết yếu khi sử dụng dbt và có thể giúp bạn tiết kiệm thời gian, công sức khi phát triển mô hình dữ liệu.
Bạn cũng có thể thấy hướng dẫn dbt này hoặc danh sách công cụ kỹ sư dữ liệu thay thế này hữu ích.
Nếu bạn muốn bắt đầu với dbt và cần học thêm, hãy khám phá Khóa học Giới thiệu về dbt của chúng tôi!
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.
