實作驗證檢查

已完成

資料管線經常遇到缺少值、重複識別碼或值超出可接受範圍的紀錄。 若沒有驗證檢查,這些資料品質問題會向下傳遞,導致分析不正確、報告失敗及商業決策不可靠。 驗證檢查會在資料擷取時發現這些問題,確保只有高品質的資料能流經你的管線。

在本單元中,您將學習如何利用 Lakeflow pipelines expectations 與 Delta Lake 表格約束,實作可空性、資料基數及範圍檢查的驗證檢查。

了解 Azure Databricks 中的驗證方法

Azure Databricks 提供兩種主要的驗證檢查機制:管線期望與資料表約束。 每種方法適用於不同的情境,並提供獨特的功能。

說明 Azure Databricks 驗證方法的圖表。

管線預期 在 Lakeflow 管線中的資料轉換期間套用驗證。 預期可在資料違反規則時發出警告、捨棄無效記錄,或讓管線失敗。 這種方法對於串流資料表和實體化視圖,需要即時品質控管時效果很好。

表格限制 直接在 Delta Lake 表格上強制執行規則。 限制會在寫入時拒絕無效資料,防止壞紀錄進入你的資料表。 此方法適用於批次處理及需要嚴格資料完整性保證的情境。

透過這些方法,你可以驗證資料品質的三個關鍵面向:空性(確保所需值存在)、資料基數(在預期範圍內驗證唯一性)、以及範圍檢查(確認值落在可接受範圍內)。

實作可為 Null 檢查

可空性驗證確保所需欄位包含值。 考慮一個客戶資料表,其中email和customer_id必須始終有值。 你可以在流程中利用期望來實施這些檢查。

使用 Python 在你的串流表定義中加入期望裝飾器:

from pyspark import pipelines as dp

@dp.table
@dp.expect_or_drop("valid_email", "email IS NOT NULL")
@dp.expect_or_drop("valid_customer_id", "customer_id IS NOT NULL")
def customers():
    return spark.readStream.table("raw.customers")

SQL 中的驗證同樣使用 CONSTRAINT 以下子句:

CREATE OR REFRESH STREAMING TABLE customers(
    CONSTRAINT valid_email EXPECT (email IS NOT NULL) ON VIOLATION DROP ROW,
    CONSTRAINT valid_customer_id EXPECT (customer_id IS NOT NULL) ON VIOLATION DROP ROW
) AS SELECT * FROM STREAM(raw.customers);

對於管線外的 Delta Lake 表格,請在表格定義中使用 NOT NULL 限制:

CREATE TABLE customers (
    customer_id INT NOT NULL,
    email STRING NOT NULL,
    first_name STRING,
    last_name STRING
);

你也可以在現有資料表中加入空無限制:

ALTER TABLE customers ALTER COLUMN email SET NOT NULL;

備註

在對現有資料表新增 NOT NULL 限制前,Azure Databricks 會先驗證所有現有資料列是否符合該限制。 若欄位中存在任何空值,該操作即告失敗。

驗證資料基數

基數驗證確保預期包含唯一值的欄位確實如此。 此檢查對於主鍵、交易識別碼及其他重複顯示資料品質問題的欄位至關重要。

管線預期可透過檢查指出唯一性問題的條件來驗證基數。 例如,您可以確認社會安全號碼每人只會出現一次:

from pyspark.sql.window import Window
from pyspark.sql.functions import count

@dp.table
@dp.expect("unique_ssn_per_person", "ssn_count = 1")
def employees():
    df = spark.table("raw.employees")
    w = Window.partitionBy("ssn")
    return df.withColumn("ssn_count", count("*").over(w))

若要進行更全面的基數檢查,請將期望與聚合邏輯結合進行轉換:

CREATE OR REFRESH MATERIALIZED VIEW order_validation AS
SELECT 
    order_id,
    COUNT(*) as occurrence_count
FROM orders
GROUP BY order_id
HAVING COUNT(*) > 1;

此具體化檢視會識別任何重複的訂單 ID,讓您能調查並解決基數問題。

Delta Lake 支援主要金鑰約束,記錄預期的唯一性,但這些限制僅供參考,並非強制執行:

CREATE TABLE orders (
    order_id INT NOT NULL,
    customer_id INT,
    order_date DATE,
    CONSTRAINT orders_pk PRIMARY KEY (order_id)
);

小提示

雖然主鍵限制不會被強制執行,但它們有助於查詢優化並記錄資料模型的預期結構。 使用管線預期主動強制執行唯一性。

套用範圍檢查

範圍驗證確認數值、日期及其他數值都在可接受範圍內。 此檢查可捕捉因資料輸入錯誤、系統故障及整合問題而產生的超出範圍的數值。

使用比較運算子或 BETWEEN 子句來定義範圍期望:

@dp.table
@dp.expect_or_fail("valid_age", "age BETWEEN 0 AND 150")
@dp.expect_or_fail("valid_salary", "salary >= 0")
@dp.expect_or_fail("valid_hire_date", "hire_date <= current_date()")
def employees():
    return spark.readStream.table("raw.employees")

在 SQL 中,套用相同的範圍檢查:

CREATE OR REFRESH STREAMING TABLE transactions(
    CONSTRAINT valid_amount EXPECT (amount > 0) ON VIOLATION DROP ROW,
    CONSTRAINT valid_date EXPECT (transaction_date <= current_date()) ON VIOLATION DROP ROW,
    CONSTRAINT valid_quantity EXPECT (quantity BETWEEN 1 AND 10000) ON VIOLATION DROP ROW
) AS SELECT * FROM STREAM(raw.transactions);

對於 Delta Lake 表格,請使用 CHECK 約束來強制寫入時的範圍:

ALTER TABLE employees ADD CONSTRAINT valid_age CHECK (age >= 18 AND age <= 120);
ALTER TABLE transactions ADD CONSTRAINT positive_amount CHECK (amount > 0);

範圍檢查也能驗證結合多種條件的商業規則:

@dp.expect("valid_discount", """
    discount_percent >= 0 
    AND discount_percent <= 100
    AND (discount_percent <= 50 OR customer_tier = 'PREMIUM')
""")

此期望確保折扣在範圍內,並規定只有保費客戶能享有超過50%的折扣。

選擇驗證失敗的動作

當驗證失敗時,你可以選擇管線的回應方式。 每個行動都符合不同的業務需求與資料重要性等級。

動作 用例 行為
警告(預設) 監視和分析 無效記錄寫入目標;記錄計量
Drop 資料清理 寫入前移除的無效紀錄
失敗 關鍵資料完整性 管線停止;交易復原

當你需要了解資料品質問題而不阻擋資料流時,請使用 警告 動作:

@dp.expect("has_phone", "phone_number IS NOT NULL")

當無效紀錄應該靜默過濾掉時,請使用 drop :

@dp.expect_or_drop("complete_address", "street IS NOT NULL AND city IS NOT NULL")

當資料完整性至關重要且無效紀錄不可接受時,使用 失敗 :

@dp.expect_or_fail("valid_account_balance", "balance >= 0")

你可以在管線介面中選擇帶有期望的資料集並開啟 「資料品質」 分頁,查看期望指標。這些指標有助於監控驗證通過率並識別系統性的資料品質問題。

既然你已經了解如何實作驗證檢查,就能確保你的資料管線能維持空檔性、基數和值範圍的品質標準。