清理和驗證數據對於確保 Lakehouse 中的數據資產質量至關重要。 本文概述旨在促進數據品質的 Azure Databricks 產品供應專案,並提供定義商業規則以實作自定義規則的建議。
Azure Databricks 上的架構強制執行
Delta Lake 提供語義來強制執行寫入過程中的架構和約束檢查,以確保湖倉中資料表的數據品質。
架構強制執行可確保寫入數據表的數據遵守預先定義的架構。 架構驗證規則會因作業而異。 請參閱 架構強制執行。
為了處理架構演進,Delta 提供進行架構變更和演進數據表的機制。 請務必仔細考慮何時使用架構演進,以避免欄位被捨棄或管線出現失敗。 如需手動或自動更新架構的詳細資訊,請參閱 更新 Delta Lake 資料表架構。
表格約束條件
條件約束可以採用參考主鍵和外鍵條件約束的形式,或強制執行的條件約束。 請參閱 ADD CONSTRAINT 子句。
Azure Databricks 上的資料表限制條件可以是強制執行或僅作參考。
強制的條件約束包括 NOT NULL 和 CHECK 條件約束。
信息性約束包括主鍵和外鍵條件約束。
處理空值或遺漏值
NOT NULL 可以在 DELTA 數據表上設置。 只有在數據行中沒有任何現有記錄為 Null 時,才能在現有的數據表上啟用它,並防止具有 Null 值的新記錄插入數據表中。
模式執行
正則表達式 (regex) 可用來在數據欄位中強制執行預期的模式。 處理需要遵守特定格式或模式的文字數據時,這特別有用。
若要透過正則表達式強制執行模式,您可以在 SQL 中使用REGEXP函式或RLIKE函式。 這些函式可讓您比對數據欄位與指定的 regex 模式。
以下是如何使用 CHECK 約束,在 SQL 中搭配正則表達式強制範式的範例:
CREATE TABLE table_name (
column_name STRING CHECK (column_name REGEXP '^[A-Za-z0-9]+$')
);
價值維護
條件約束可用來在數據表中的數據行上強制執行值範圍。 這可確保只允許插入或更新指定範圍內的有效值。
若要強制執行值範圍條件約束,您可以在 SQL 中使用 CHECK 條件約束。
CHECK 條件約束可讓您定義數據表中每個數據列都必須為 true 的條件。
以下是如何使用 CHECK 條件約束在數據行上強制執行值範圍的範例:
CREATE TABLE table_name (
column_name INT CHECK (column_name >= 0 AND column_name <= 100)
);
使用 Lakeflow Spark 宣告式管線定義和設定期望。
Lakeflow Spark 宣告式管線可讓您在宣告具體化檢視或串流資料表時定義預期。 您可以選擇設定預期配置來提供違規警告、刪除違規記錄,或導致工作負載因違規而失敗。 請參閱 使用管線預期來管理資料品質。
數據監視
Azure Databricks 提供數據品質監視服務,可讓您監視帳戶中所有數據表的統計屬性和品質。 請參閱 資料分析。
轉換數據類型
在數據表中插入或更新數據時,Azure Databricks 會在可以安全地執行時轉換數據類型,而不會遺失資訊。
如需了解有關轉型行為的詳細資訊,請查看以下文章:
自定義商業規則
您可以使用篩選和 WHERE 子句來定義自定義邏輯,以隔離不正確的記錄,並防止它們傳播至下游數據表。
CASE WHEN ... OTHERWISE 子句可讓您定義條件式邏輯,以優雅的方式將商業邏輯套用至以可預測方式違反預期的記錄。
DECLARE current_time = now()
INSERT INTO silver_table
SELECT * FROM bronze_table
WHERE event_timestamp <= current_time AND quantity >= 0;
INSERT INTO quarantine_table
SELECT * FROM bronze_table
WHERE event_timestamp > current_time OR quantity < 0;
注意
Databricks 建議一律將篩選的數據當作個別的寫入作業來處理,特別是在使用結構化串流時。 使用 .foreachBatch 寫入多個數據表可能會導致結果不一致。
例如,您可能有無法編碼 NULL 值的上游系統,因此佔位元值 -1 可用來表示遺漏的數據。 在 Azure Databricks 中,您不需要為所有下游查詢撰寫自定義邏輯來忽略包含 -1 的記錄,而可以使用 CASE WHEN 語句在轉換過程中動態替換這些記錄。
INSERT INTO silver_table
SELECT
* EXCEPT weight,
CASE
WHEN weight = -1 THEN NULL
ELSE weight
END AS weight
FROM bronze_table;