Kiểm tra đơn vị SQL bằng dbt
Sau nhiều năm làm việc về khoa học và kỹ thuật dữ liệu, chất lượng dữ liệu là bóng ma treo cổ xuất hiện trong hầu hết mọi dự án, làm giảm thành tích kinh doanh.
SQL là ngôn ngữ thực tế của Dữ liệu. Một cách để cải thiện chất lượng dữ liệu là tăng cường cơ sở mã SQL bằng kiểm tra đơn vị và kiểm tra dữ liệu. Bài viết này chủ yếu lấy cảm hứng từ bài viết của bà Gao .
Trong bài viết này, logic cơ bản của kiểm tra đơn vị trên SQL với dbt sẽ được minh họa bằng tập dữ liệu đơn giản.
Ý kiến cơ bản
Ý tưởng cơ bản của việc tiến hành kiểm tra đơn vị trên SQL hoàn toàn giống như thực hiện kiểm tra đơn vị trên mã Python:
- giả lập một đầu vào có thể kiểm soát D
- có mô-đun/chức năng/thuật toán có thể kiểm tra , hãy gọi nó là A
- tính toán kết quả mong đợi bằng cách sử dụng D làm đầu vào, lấy O_nên
- so sánh kết quả mong đợi (O_nên) với đầu ra thực tế từ A (O_is)
Đôi khi nó không nhất thiết phải khớp chính xác, nghĩa là chỉ khớp tối đa 2 chữ số sau dấu thập phân.
Một ví dụ
Hãy xây dựng một ví dụ ngây thơ, để minh họa cho ý tưởng trên. Chúng tôi cần cấu trúc thư mục dự án dbt sau
-- dbt_project.yml
-- data/
------ iris.csv
------ selected_iris_expected.csv
-- models/
------ iris/
---------- selected_iris.sql
---------- schema.yml
# example: dbt_project.yml
# take things under data/ as seeds
data-paths: ["data"]
# configure seed, all going into unittesting schema
seeds:
schema: unittesting
-- selected_iris.sql
{{ config(
materialized='table',
schema='unittesting',
tags=['iris']
)
}}
-- count the number of special iris id (above average in all aspects)
-- not a very meaningful logic, just for exemplare purpose
SELECT
distinct count(distinct id)
FROM "public"."iris";
where sepallengthcm > 5.9 and sepalwidthcm > 3.1 and petallengthcm > 3.8 and petalwidthcm > 1.2
-- selected_iris_expected.csv
count
150
# schema.yml
version: 2
# table model selected_iris should be equal to iris
models:
- name: selected_iris
tests:
- dbt_utils.equality:
compare_model: ref('selected_iris_expected')
tags: ['unit_testing']
Bước 1: tải dữ liệu thử nghiệm vào cơ sở dữ liệu
# here we use
# iris.csv will be loaded into unittesting.iris table
# selected_iris_expected.csv will be loaded into unittesting.selected_iris_expected table
dbt seed
# build selected_iris model into unittesting.selected_iris
dbt run
Bước 2: so sánh
# here we use
# all tests within folder model/iris/ with be executed
# of course, we can restrict to only unittesting using tags
dbt test --model iris
kỹ thuật
Kiểm tra đơn vị SQL có vẻ đơn giản phải không? nhưng trong thực tế, mọi thứ có thể phức tạp hơn:
- bạn có thể cần một cấu trúc thư mục phức tạp hơn (sử dụng các thư mục con lồng nhau) để phân tách và sắp xếp các bài kiểm tra theo dự án
- bạn có thể cần bật/tắt kiểm tra đơn vị dựa trên môi trường hiện tại dev/prod
- bạn có thể có bảng đầu vào lớn khó mô phỏng
- bạn có thể có mô hình phức tạp, khó có thể tính toán trước kết quả mong đợi (mô hình không thể kiểm tra được)
- kết quả dự kiến có thể không khớp 100% với đầu ra thực tế (thậm chí chúng thực tế giống nhau) do độ chính xác của số động, v.v.
- hoặc đơn giản là bạn không có quỹ thời gian cho dự án này, điều này không có gì lạ, mọi người không kiểm tra đơn vị sql nhiều vào năm 2022, các câu lệnh SQL được coi là chính xác sau khi được viết
Mẹo: Mô đun hóa các câu lệnh SQL
Bất chấp tất cả những thách thức được liệt kê ở trên, có một điều giúp ích cho việc kiểm tra đơn vị trong trường hợp của SQL cũng như bất kỳ ngôn ngữ lập trình tổng quát nào khác như Python.
Đó là Modularization. Một mô hình/chức năng/thuật toán được mô đun hóa tốt đảm bảo khả năng kiểm tra và khả năng đọc, ngay cả đối với sql.
Có nhiều cách để nhận ra điều này với sql và dbt:
- vĩ mô dbt (https://docs.getdbt.com/docs/build/jinja-macros)
- với tuyên bố (https://learnsql.com/blog/what-is-with-clause-sql/)
Phần kết luận
SQL là ngôn ngữ gốc của dữ liệu, trong bài viết này, chúng tôi đã trình bày cách thực hiện kiểm tra đơn vị SQL với dbt.
Tương tự như vậy, chúng tôi cũng có thể thực hiện kiểm tra tích hợp dữ liệu hoặc các thủ thuật khác như ủy thác việc tạo sql sang ngôn ngữ mạnh hơn như python bằng cách sử dụng rasgoQ L.

![Dù sao thì một danh sách được liên kết là gì? [Phần 1]](https://post.nghiatu.com/assets/images/m/max/724/1*Xokk6XOjWyIGCBujkJsCzQ.jpeg)



































