Implementowanie sprawdzania poprawności

Ukończone

Wskazówka

Aby uzyskać więcej szczegółów, zobacz kartę Tekst i obrazy .

Potoki danych często napotykają rekordy z brakującymi wartościami, zduplikowanymi identyfikatorami lub wartościami, które wykraczają poza dopuszczalne zakresy. Bez mechanizmów sprawdzania poprawności, te problemy z jakością danych rozprzestrzeniają się w dół strumienia danych, powodując nieprawidłowe analizy, nietrafione raporty i niewiarygodne decyzje biznesowe. Walidacja wychwytuje te problemy w momencie pozyskiwania danych, zapewniając, że przez potok przepływają tylko dane wysokiej jakości.

W tej lekcji dowiesz się, jak zaimplementować sprawdzanie poprawności pod kątem dopuszczalności wartości null, kardynalności danych i kontroli zakresu przy użyciu oczekiwań potoków usługi Lakeflow i ograniczeń tabeli usługi Delta Lake.

Omówienie metod walidacji w usłudze Azure Databricks

Usługa Azure Databricks udostępnia dwa podstawowe mechanizmy implementowania kontroli poprawności: oczekiwania dotyczące potoku i ograniczenia tabel. Każde podejście obsługuje różne scenariusze i oferuje różne możliwości.

Diagram wyjaśniający metody sprawdzania poprawności w usłudze Azure Databricks.

Oczekiwania w potoku stosują walidację podczas przekształcania danych w potokach usługi Lakeflow. Oczekiwania pozwalają na ostrzeganie, usuwanie nieprawidłowych rekordów lub przerwanie działania potoku w przypadku, gdy dane naruszają Twoje reguły. Takie podejście działa dobrze w przypadku tabel przesyłania strumieniowego i zmaterializowanych widoków, w których potrzebna jest kontrola jakości w czasie rzeczywistym.

Ograniczenia tabel wymuszają reguły bezpośrednio w tabelach Delta Lake. Ograniczenia odrzucają nieprawidłowe dane w czasie zapisu, co uniemożliwia wprowadzanie nieprawidłowych rekordów w tabelach. Takie podejście odpowiada przetwarzaniu wsadowemu oraz scenariuszom wymagającym rygorystycznych gwarancji integralności danych.

Dzięki tym podejściom można zweryfikować trzy kluczowe wymiary jakości danych: nullowalność (zapewnienie istnienia wymaganych wartości), kardynalność danych (weryfikowanie unikatowości tam, gdzie jest to oczekiwane) i sprawdzanie zakresu (potwierdzanie, że wartości mieszczą się w dopuszczalnych granicach).

Implementuj kontrolę wartości null

Walidacja nullowalności gwarantuje, że wymagane kolumny zawierają wartości. Rozważ tabelę klienta, w której email i customer_id zawsze musi mieć wartości. Możesz zaimplementować te sprawdzenia przy użyciu oczekiwań w przepływie.

Używając języka Python, dodaj dekoratory oczekiwań do definicji tabeli przesyłania strumieniowego:

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")

Ta sama walidacja w języku SQL używa klauzuli 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);

W przypadku tabel Delta Lake spoza potoków użyj NOT NULL ograniczeń w definicji tabeli:

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

Możesz również dodać ograniczenia dotyczące wartości null do istniejących tabel.

ALTER TABLE customers ALTER COLUMN email SET NOT NULL;

Uwaga / Notatka

Przed dodaniem NOT NULL ograniczenia do istniejącej tabeli usługa Azure Databricks sprawdza, czy wszystkie istniejące wiersze spełniają ograniczenie. Operacja kończy się niepowodzeniem, jeśli w kolumnie istnieją jakiekolwiek wartości null.

Weryfikowanie kardynalności danych

Walidacja kardynalności zapewnia, że kolumny faktycznie zawierają unikatowe wartości. Ta kontrola jest niezbędna w przypadku kluczy podstawowych, identyfikatorów transakcji i innych pól, w których duplikaty wskazują problemy z jakością danych.

Oczekiwania potoku mogą weryfikować kardynalność, sprawdzając warunki wskazujące problemy z unikatowością. Możesz na przykład sprawdzić, czy numer ubezpieczenia społecznego jest wyświetlany tylko raz na osobę:

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))

Aby uzyskać bardziej kompleksowe kontrole kardynalności, połącz oczekiwania z logiką agregacji w transformacji:

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

Ten zmaterializowany widok identyfikuje wszelkie zduplikowane identyfikatory zamówień, co umożliwia przeprowadzenie analizy i rozwiązanie problemów związanych z kardynalnością.

Delta Lake obsługuje ograniczenia klucza podstawowego, które dokumentują oczekiwaną unikatowość, jednak są to tylko dodatkowe informacje i nie są one wymuszane.

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

Wskazówka

Chociaż ograniczenia klucza podstawowego nie są wymuszane, ułatwiają optymalizację zapytań i dokumentowanie zamierzonej struktury modelu danych. Użyj reguł potoku przetwarzania, aby aktywnie zapewniać unikatowość.

Zastosuj sprawdzanie zakresu

Sprawdzanie poprawności zakresu potwierdza, że wartości liczbowe, daty i inne należą do dopuszczalnych granic. To sprawdzenie przechwytuje błędy wprowadzania danych, błędy systemowe i problemy z integracją, które generują wartości poza zakresem.

Zdefiniuj oczekiwania dotyczące zakresu przy użyciu operatorów porównania lub klauzuli 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")

W programie SQL zastosuj te same kontrole zakresu:

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);

W przypadku tabel Delta Lake użyj ograniczeń CHECK, aby wymusić zakresy w czasie zapisu:

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

Kontrole zakresu mogą również weryfikować reguły biznesowe, które łączą wiele warunków:

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

To oczekiwanie gwarantuje, że rabaty pozostają w granicach i wymuszają, że tylko klienci premium otrzymują rabaty powyżej 50%.

Wybierz działania dla niepowodzeń walidacji

Gdy walidacja zakończy się niepowodzeniem, wybierz, jak pipeline ma reagować. Każda akcja odpowiada różnym wymaganiom biznesowym i poziomom krytycznym danych.

Akcja Przypadek użycia Zachowanie
Ostrzegaj (ustawienie domyślne) Monitorowanie i analizy Nieprawidłowe rekordy zapisywane do lokalizacji docelowej; metryki zarejestrowane
Zrzuć Czyszczenie danych Nieprawidłowe rekordy usunięte przed zapisem
Niepowodzenie Krytyczna integralność danych Potok został zatrzymany; transakcja została wycofana

Użyj akcji ostrzegania , jeśli potrzebujesz wglądu w problemy z jakością danych bez blokowania przepływu danych:

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

Użyj drop, gdy nieprawidłowe rekordy powinny być odfiltrowane bez powiadamiania:

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

Użyj fail, gdy integralność danych jest krytyczna i nieprawidłowe rekordy są niedopuszczalne:

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

Metryki oczekiwań można wyświetlić w interfejsie użytkownika potoku, wybierając zestaw danych z oczekiwaniami i otwierając kartę Jakość danych . Te metryki pomagają monitorować współczynniki powodzenia weryfikacji i identyfikować systematyczne problemy z jakością danych.

Teraz, gdy już wiesz, jak zaimplementować kontrole walidacji, możesz zapewnić, że potoki danych spełniają standardy jakości dla nullowalności, kardynalności oraz zakresów wartości.