![Search icon](https://hackernoon.imgix.net/search-new.png?w=19&h=19)
Jedną z najważniejszych umiejętności doświadczonego specjalisty ds. danych jest skuteczne zarządzanie dużymi zbiorami danych, zapewniające jakość i niezawodność danych. Dane są centralnym i fundamentalnym elementem każdego systemu danych, a niezależnie od tego, jakie dobre umiejętności posiadasz w innych aspektach naszego zawodu, nie możesz sobie pozwolić na ich przeoczenie.
W tym artykule omawiam solidne techniki wykonywania kontroli jakości na dużych zestawach danych przy użyciu biblioteki Deequ i metod statystycznych. Łącząc podejścia, które wyjaśniam poniżej, będziesz w stanie zachować integralność danych, udoskonalić swoje praktyki zarządzania danymi i zapobiec potencjalnym problemom w aplikacjach downstream.
Zapewnienie jakości danych na dużą skalę to trudne zadanie, zwłaszcza w przypadku miliardów wierszy przechowywanych w rozproszonych systemach plików lub magazynach danych. Biblioteka Deequ to otwartoźródłowy framework profilowania danych i kontroli jakości zbudowany na platformie Spark, który jest nowoczesnym i wszechstronnym narzędziem zaprojektowanym w celu rozwiązania tego problemu. To, co wyróżnia ją spośród podobnych narzędzi, to możliwość bezproblemowej integracji ze Spark, wykorzystując rozproszoną moc przetwarzania do wydajnej obsługi dużych zestawów danych.
Gdy go wypróbujesz, zobaczysz, jak jego elastyczność pozwala definiować złożone reguły walidacji dostosowane do Twoich konkretnych wymagań, zapewniając kompleksowe pokrycie. Ponadto Deequ oferuje rozbudowane metryki i możliwości wykrywania anomalii, które pomogą Ci identyfikować i proaktywnie rozwiązywać problemy z jakością danych. Dla profesjonalistów zajmujących się danymi, którzy pracują z dużymi i dynamicznymi zbiorami danych, Deequ jest rozwiązaniem typu „nóż szwajcarski”. Zobaczmy, jak możemy go wykorzystać.
Więcej szczegółów na temat konfiguracji biblioteki Deequ i przypadków użycia wokół profilowania danych jest dostępnych tutaj . Dla uproszczenia w tym przykładzie wygenerowaliśmy tylko kilka rekordów zabawek:
val rdd = spark.sparkContext.parallelize(Seq( Item(1, "Thingy A", "awesome thing.", "high", 0), Item(2, "Thingy B", "available at http://thingb.com", null, 0), Item(3, null, null, "low", 5), Item(4, "Thingy D", "checkout https://thingd.ca", "low", 10), Item(5, "Thingy E", null, "high", 12))) val data = spark.createDataFrame(rdd)
Większość aplikacji danych zawiera niejawne założenia dotyczące atrybutów danych, takie jak wartości inne niż NULL i unikalność. W przypadku Deequ założenia te stają się jawne poprzez testy jednostkowe. Oto kilka typowych sprawdzeń:
Liczba wierszy: upewnij się, że zestaw danych zawiera określoną liczbę wierszy.
Kompletność atrybutów: sprawdź, czy atrybuty takie jak id i productName nigdy nie mają wartości NULL.
Unikalność atrybutu: upewnij się, że pewne atrybuty, np. id, są unikatowe.
Zakres wartości: sprawdź, czy atrybuty, takie jak priorytet i liczba widoków, mieszczą się w oczekiwanych zakresach.
Dopasowywanie wzorców: sprawdź, czy opisy zawierają adresy URL, gdy jest to oczekiwane.
Właściwości statystyczne: Upewnij się, że mediana atrybutów liczbowych spełnia określone kryteria.
Oto jak można wdrożyć te kontrole przy użyciu Deequ:
import com.amazon.deequ.VerificationSuite import com.amazon.deequ.checks.{Check, CheckLevel, CheckStatus} val verificationResult = VerificationSuite() .onData(data) .addCheck( Check(CheckLevel.Error, "unit testing my data") .hasSize(_ == 5) // we expect 5 rows .isComplete("id") // should never be NULL .isUnique("id") // should not contain duplicates .isComplete("productName") // should never be NULL // should only contain the values "high" and "low" .isContainedIn("priority", Array("high", "low")) .isNonNegative("numViews") // should not contain negative values // at least half of the descriptions should contain a url .containsURL("description", _ >= 0.5) // half of the items should have less than 10 views .hasApproxQuantile("numViews", 0.5, _ <= 10)) .run()
Po uruchomieniu tych sprawdzeń Deequ tłumaczy je na serię zadań Spark, które wykonuje, aby obliczyć metryki danych. Następnie wywołuje funkcje asercji (np. _ == 5 w celu sprawdzenia rozmiaru) dla tych metryk, aby sprawdzić, czy ograniczenia obowiązują w danych. Możemy sprawdzić obiekt „verificationResult”, aby sprawdzić, czy test znalazł błędy:
import com.amazon.deequ.constraints.ConstraintStatus if (verificationResult.status == CheckStatus.Success) { println("The data passed the test, everything is fine!") } else { println("We found errors in the data:\n") val resultsForAllConstraints = verificationResult.checkResults .flatMap { case (_, checkResult) => checkResult.constraintResults } resultsForAllConstraints .filter { _.status != ConstraintStatus.Success } .foreach { result => println(s"${result.constraint}: ${result.message.get}") } }
Jeśli uruchomimy przykład, otrzymamy następujący wynik:
We found errors in the data: CompletenessConstraint(Completeness(productName)): Value: 0.8 does not meet the requirement! PatternConstraint(containsURL(description)): Value: 0.4 does not meet the requirement!
Test wykazał, że nasze założenia zostały naruszone! Tylko 4 z 5 (80%) wartości atrybutu productName są różne od null, a tylko 2 z 5 (tj. 40%) wartości atrybutu description zawierały adres URL. Na szczęście przeprowadziliśmy test i znaleźliśmy błędy; ktoś powinien natychmiast naprawić dane!
Podczas gdy Deequ oferuje solidne ramy do walidacji danych, integracja metod statystycznych może dodatkowo usprawnić kontrole QA, zwłaszcza jeśli masz do czynienia z zagregowanymi metrykami zestawu danych. Zobaczmy, jak możesz wykorzystać metody statystyczne do monitorowania i zapewniania jakości danych.
Rozważmy scenariusz biznesowy, w którym proces ETL (Extract, Transform, Load) generuje N rekordów w ramach codziennego zaplanowanego zadania. Zespoły wsparcia mogą chcieć skonfigurować kontrole QA, aby wywołać alert, jeśli wystąpi znaczne odchylenie w liczbie rekordów. Na przykład, jeśli proces zazwyczaj generuje od 9500 do 10500 rekordów dziennie przez dwa miesiące, każdy znaczny wzrost lub spadek może wskazywać na problem z podstawowymi danymi.
Możemy użyć metody statystycznej, aby zdefiniować ten próg, na podstawie którego proces powinien wysłać alert do zespołu wsparcia. Poniżej znajduje się ilustracja śledzenia liczby rekordów w ciągu dwóch miesięcy:
Aby to przeanalizować, możemy przekształcić dane dotyczące liczby rekordów, aby obserwować codzienne zmiany. Zmiany te zazwyczaj oscylują wokół zera, jak pokazano na poniższym wykresie:
Gdy przedstawiamy tę szybkość zmian za pomocą rozkładu normalnego, tworzy ona krzywą dzwonową, wskazującą, że dane są rozłożone normalnie. Oczekiwana zmiana wynosi około 0%, przy odchyleniu standardowym 2,63%.
Ta analiza sugeruje, że liczba rekordów zazwyczaj mieści się w zakresie od -5,26% do +5,25% z 90% pewnością. Na tej podstawie możesz ustalić regułę, która wywoła alert, jeśli liczba rekordów odchyli się poza ten zakres, zapewniając szybką interwencję.
Pokrycie atrybutu odnosi się do stosunku wartości innych niż NULL do całkowitej liczby rekordów dla migawki zestawu danych. Na przykład, jeśli 8 z 100 rekordów ma wartość NULL dla określonego atrybutu, pokrycie dla tego atrybutu wynosi 92%.
Przyjrzyjmy się innemu przypadkowi biznesowemu z procesem ETL generującym codziennie migawkę tabeli produktów. Chcemy monitorować zasięg atrybutów opisu produktu. Jeśli zasięg spadnie poniżej określonego progu, należy uruchomić alert dla zespołu wsparcia. Poniżej znajduje się wizualna reprezentacja zasięgu atrybutów opisów produktów w ciągu dwóch miesięcy:
Analizując bezwzględne różnice w zasięgu z dnia na dzień, obserwujemy, że zmiany oscylują wokół zera:
Przedstawienie tych danych jako rozkładu normalnego pokazuje, że jest on rozkładem normalnym ze spodziewaną zmianą na poziomie około 0% i odchyleniem standardowym wynoszącym 2,45%.
Jak widać, dla tego zestawu danych pokrycie atrybutu opisu produktu zwykle mieści się w zakresie od -4,9% do +4,9% z 90% pewnością. Na podstawie tego wskaźnika możemy ustawić regułę, aby wywołać alert, jeśli pokrycie odbiega poza ten zakres.
Jeśli pracujesz z zestawami danych, które wykazują znaczące wahania z powodu czynników takich jak sezonowość lub trendy, tradycyjne metody statystyczne mogą wyzwalać fałszywe alerty. Algorytmy szeregów czasowych oferują bardziej wyrafinowane podejście, poprawiając dokładność i niezawodność kontroli QA.
Aby generować bardziej sensowne alerty, możesz użyć albo
Załóżmy model sprzedaży dziennej, który odzwierciedla zarówno trendy, jak i wzorce sezonowe, korzystając z modelu Holta-Wintersa:
import pandas as pd from statsmodels.tsa.holtwinters import ExponentialSmoothing # Load and preprocess the dataset data = pd.read_csv('sales_data.csv', index_col='date', parse_dates=True) data = data.asfreq('D').fillna(method='ffill') # Fit the Holt-Winters model model = ExponentialSmoothing(data, trend='add', seasonal='add', seasonal_periods=365) fit = model.fit() # Forecast and detect anomalies forecast = fit.fittedvalues residuals = data - forecast threshold = 3 * residuals.std() anomalies = residuals[abs(residuals) > threshold] print("Anomalies detected:") print(anomalies)
Stosując tę metodę można wykryć znaczące odchylenia, które mogą wskazywać na problemy z jakością danych, co pozwala na bardziej zniuansowane podejście do kontroli jakości.
Mam nadzieję, że ten artykuł pomoże Ci skutecznie wdrożyć kontrole QA dla dużych zestawów danych. Korzystając z biblioteki Deequ i integrując metody statystyczne i algorytmy szeregów czasowych, możesz zapewnić integralność i niezawodność danych, ostatecznie ulepszając swoje praktyki zarządzania danymi.
Wdrożenie opisanych powyżej technik pomoże Ci zapobiec potencjalnym problemom w aplikacjach przetwarzających dane i poprawić ogólną jakość przepływów danych.