在談 dbt 的那幾天有稍微講到相關的測試,今天在繼續聊一聊有哪些測試可以做,如果還沒看前面的 dbt 說明,可以從下方連結過去
DBT 經典案例 Jaffle Shop (2) - 轉換步驟指南
簡單來說就是 DBT (Data Build Tool) 裡的一個測試資料品質的功能,確保數據轉換過程的準確性、一致性和完整性,優點有哪些:
可以直接在 schema.yml
文件中設定
models:
- name: customers
columns:
- name: customer_id
tests:
- unique
- not_null
- name: customer_type
tests:
- accepted_values:
values: ['level1', 'level2', 'vip']
單一測試是自訂的 SQL 查詢,用於檢查特定的業務邏輯或條件,通常放在 tests 目錄下
-- tests/assert_total_payments_positive.sql
SELECT
order_id,
SUM(amount) as total_amount
FROM {{ ref('payments') }}
GROUP BY 1
HAVING total_amount < 0
這個測試就是在判斷訂單總金額不能是負的
可以創造自己的通用測試,例如檢查偶數的測試:
-- macros/test_is_even.sql
{% test is_even(model, column_name) %}
SELECT *
FROM {{ model }}
WHERE {{ column_name }} % 2 != 0
{% endtest %}
Q:還記得
macros
資料夾嗎?
A:macros
資料夾中會放可重複使用的程式碼片段或函數,讓你能夠在 SQL 查詢中使用類似程式語言的邏輯,提高了 SQL 的靈活性和避免過多重複內容。
然後在 schema.yml
中直接使用 is_even
:
models:
- name: even_numbers
columns:
- name: number
tests:
- is_even
{% call statement('create_temp_table', fetch_result=True) %}
CREATE TEMP TABLE temp_results AS (
SELECT
o.order_id,
o.total_amount,
SUM(oi.quantity * oi.unit_price) as calculated_total,
CASE
WHEN o.total_amount != SUM(oi.quantity * oi.unit_price) THEN true
ELSE false
END as test_failed
FROM orders o
JOIN order_items oi ON o.order_id = oi.order_id
GROUP BY o.order_id, o.total_amount
)
{% endcall %}
SELECT * FROM temp_results WHERE test_failed = true
這個範例檢查每個訂單的總金額是否與訂單項目的總和相同。如果不相同,test_failed
會被標記為 true。
透過創建臨時表 temp_results 讓測試更好管理,測試如果更複雜的話,用臨時表也會更好懂
dbt test
如果只想跑特定類型的測試
dbt test --select test_type:generic
dbt test --select test_type:singular
測試失敗是再正常不過,完全沒失敗比較可怕,因為正式上線可能就會
阿伯~初四了
你的資料不是你的資料
今天就先這樣吧,有機會再說如何用dbt_utils
做測試,明天會先介紹 《遠大前程》(Great Expectations)
的測試~