![Search icon](https://hackernoon.imgix.net/search-new.png?w=19&h=19)
Jednou z dôležitých zručností skúseného dátového profesionála je efektívne narábanie s veľkými dátovými súbormi, zabezpečenie kvality a spoľahlivosti dát. Dáta sú ústrednou a základnou súčasťou každého dátového systému a nech už máte akékoľvek dobré zručnosti v iných aspektoch nášho obchodu, tieto si nemôžete dovoliť prehliadať.
V tomto článku skúmam robustné techniky na vykonávanie kontrol QA na veľkých súboroch údajov pomocou knižnice Deequ a štatistických metód. Kombináciou prístupov, ktoré vysvetľujem nižšie, budete môcť zachovať integritu údajov, zlepšiť postupy správy údajov a predchádzať potenciálnym problémom v nadväzujúcich aplikáciách.
Zabezpečenie kvality údajov vo veľkom rozsahu je náročná úloha, najmä pri práci s miliardami riadkov uložených v distribuovaných súborových systémoch alebo dátových skladoch. Knižnica Deequ je open-source dátový profil a rámec QA postavený na Spark, ktorý je moderným a všestranným nástrojom určeným na riešenie tohto problému. To, čo ho odlišuje od podobných nástrojov, je jeho schopnosť hladko sa integrovať so Sparkom, pričom využíva výkon distribuovaného spracovania na efektívne spracovanie rozsiahlych súborov údajov.
Keď to vyskúšate, uvidíte, ako vám jeho flexibilita umožňuje definovať komplexné pravidlá overovania prispôsobené vašim špecifickým požiadavkám, čím sa zabezpečí komplexné pokrytie. Deequ navyše ponúka rozsiahle metriky a možnosti detekcie anomálií, ktoré vám pomôžu identifikovať a proaktívne riešiť problémy s kvalitou údajov. Pre dátových profesionálov, ktorí pracujú s veľkými a dynamickými súbormi údajov, je Deequ riešením pre švajčiarsky nôž. Pozrime sa, ako to môžeme využiť.
Viac podrobností o nastavení knižnice Deequ a prípadoch použitia týkajúcich sa profilovania údajov nájdete tu . Kvôli jednoduchosti sme v tomto príklade vygenerovali niekoľko záznamov o hračkách:
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)
Väčšina dátových aplikácií prichádza s implicitnými predpokladmi o atribútoch údajov, ako sú hodnoty a jedinečnosť iné ako NULL. S Deequ sa tieto predpoklady stanú explicitnými prostredníctvom jednotkových testov. Tu je niekoľko bežných kontrol:
Počet riadkov: Uistite sa, že množina údajov obsahuje konkrétny počet riadkov.
Úplnosť atribútu: Skontrolujte, či atribúty ako id a productName nikdy nemajú hodnotu NULL.
Jedinečnosť atribútu: Uistite sa, že určité atribúty, ako napríklad id, sú jedinečné.
Rozsah hodnôt: Overte, či atribúty ako priorita a numViews spadajú do očakávaných rozsahov.
Zhoda vzorov: Overte, či popisy obsahujú adresy URL, keď sa očakáva.
Štatistické vlastnosti: Zabezpečte, aby medián číselných atribútov spĺňal špecifické kritériá.
Tu je návod, ako môžete implementovať tieto kontroly pomocou 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 vykonaní týchto kontrol ich Deequ preloží do série úloh Spark, ktoré vykoná na výpočet metrík údajov. Potom vyvolá vaše funkcie tvrdenia (napr. _ == 5 pre kontrolu veľkosti) na týchto metrikách, aby zistil, či obmedzenia platia pre údaje. Môžeme skontrolovať objekt „verificationResult“, aby sme zistili, či test našiel chyby:
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}") } }
Ak spustíme príklad, dostaneme nasledujúci výstup:
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 zistil, že naše predpoklady boli porušené! Iba 4 z 5 (80 %) hodnôt atribútu productName sú nenulové a iba 2 z 5 (tj 40 %) hodnôt atribútu description obsahovali URL. Našťastie sme vykonali test a našli chyby; niekto by mal okamžite opraviť údaje!
Zatiaľ čo Deequ ponúka robustný rámec na validáciu údajov, integrácia štatistických metód môže ďalej zlepšiť vaše kontroly kvality, najmä ak máte čo do činenia s agregovanými metrikami súboru údajov. Pozrime sa, ako môžete použiť štatistické metódy na monitorovanie a zabezpečenie kvality údajov.
Zvážte obchodný scenár, v ktorom proces ETL (Extract, Transform, Load) produkuje N záznamov na dennej plánovanej úlohe. Podporné tímy môžu chcieť nastaviť kontroly kvality, aby upozornili, ak dôjde k významnej odchýlke v počte záznamov. Napríklad, ak proces zvyčajne generuje 9 500 až 10 500 záznamov denne počas dvoch mesiacov, akýkoľvek významný nárast alebo pokles môže naznačovať problém so základnými údajmi.
Môžeme použiť štatistickú metódu na definovanie tohto prahu, na ktorý proces by mal upozorniť tím podpory. Nižšie je uvedený príklad sledovania počtu rekordov počas dvoch mesiacov:
Aby sme to analyzovali, môžeme transformovať údaje o počte záznamov, aby sme mohli sledovať každodenné zmeny. Tieto zmeny vo všeobecnosti oscilujú okolo nuly, ako ukazuje nasledujúci graf:
Keď znázorníme túto rýchlosť zmeny s normálnym rozdelením, vytvorí sa zvonová krivka, čo naznačuje, že údaje sú rozdelené normálne. Očakávaná zmena je okolo 0 %, so štandardnou odchýlkou 2,63 %.
Táto analýza naznačuje, že počet záznamov zvyčajne spadá do rozsahu -5,26 % až +5,25 % so spoľahlivosťou 90 %. Na základe toho môžete vytvoriť pravidlo na upozornenie, ak sa počet záznamov odchýli mimo tento rozsah, čím sa zabezpečí včasný zásah.
Atribút coverag e sa týka pomeru hodnôt, ktoré nie sú NULL, k celkovému počtu záznamov pre snímku množiny údajov. Ak má napríklad 8 zo 100 záznamov pre konkrétny atribút hodnotu NULL, pokrytie tohto atribútu je 92 %.
Pozrime sa na ďalší obchodný prípad s procesom ETL, ktorý denne generuje snímku tabuľky produktov. Chceme sledovať pokrytie atribútov popisu produktu. Ak pokrytie klesne pod určitú hranicu, podporný tím by mal byť upozornený. Nižšie je uvedené vizuálne znázornenie pokrytia atribútov pre popisy produktov počas dvoch mesiacov:
Analýzou absolútnych denných rozdielov v pokrytí pozorujeme, že zmeny oscilujú okolo nuly:
Znázornenie týchto údajov ako normálneho rozdelenia ukazuje, že je normálne rozdelené s očakávanou zmenou okolo 0 % a štandardnou odchýlkou 2,45 %.
Ako vidíme, pre tento súbor údajov sa pokrytie atribútu popisu produktu zvyčajne pohybuje od -4,9 % do +4,9 % s 90 % istotou. Na základe tohto indikátora môžeme nastaviť pravidlo na upozornenie, ak sa pokrytie odchýli od tohto rozsahu.
Ak pracujete s množinami údajov, ktoré vykazujú významné odchýlky v dôsledku faktorov, ako je sezónnosť alebo trendy, tradičné štatistické metódy môžu spustiť falošné upozornenia. Algoritmy časových radov ponúkajú prepracovanejší prístup, zlepšujúci presnosť a spoľahlivosť vašich kontrol QA.
Na vytvorenie rozumnejších upozornení môžete použiť buď
Poďme si namodelovať denný predaj, ktorý vykazuje trendové aj sezónne vzory pomocou Holt-Winters:
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)
Pomocou tejto metódy môžete zistiť významné odchýlky, ktoré môžu naznačovať problémy s kvalitou údajov, a poskytnúť tak jemnejší prístup ku kontrolám QA.
Dúfam, že tento článok vám pomôže efektívne implementovať kontroly kvality pre vaše veľké súbory údajov. Použitím knižnice Deequ a integráciou štatistických metód a algoritmov časových radov môžete zaistiť integritu a spoľahlivosť údajov, čo v konečnom dôsledku zlepší vaše postupy správy údajov.
Implementácia vyššie opísaných techník vám pomôže predchádzať potenciálnym problémom v nadväzujúcich aplikáciách a zlepšiť celkovú kvalitu vašich dátových pracovných tokov.