![Search icon](https://hackernoon.imgix.net/search-new.png?w=19&h=19)
Yksi osaavan data-ammattilaisen elintärkeistä taidoista on suurten tietojoukkojen tehokas käsittely, joka varmistaa tiedon laadun ja luotettavuuden. Data on minkä tahansa tietojärjestelmän keskeinen ja perustavanlaatuinen osa, ja riippumatta siitä, mitä hyviä taitoja sinulla on muilla kauppamme osa-alueilla, sinulla ei ole varaa sivuuttaa tätä.
Tässä artikkelissa tutkin vankkoja tekniikoita suurten tietojoukkojen laadunvarmistustarkastuksiin käyttämällä Deequ-kirjastoa ja tilastollisia menetelmiä. Yhdistämällä alla selittämiäni lähestymistapoja pystyt säilyttämään tietojen eheyden, parantamaan tiedonhallintakäytäntöjäsi ja ehkäisemään mahdollisia ongelmia loppupään sovelluksissa.
Tietojen laadun varmistaminen mittakaavassa on pelottava tehtävä, varsinkin kun käsitellään hajautettuihin tiedostojärjestelmiin tai tietovarastoihin tallennettuja miljardeja rivejä. Deequ-kirjasto on Sparkiin rakennettu avoimen lähdekoodin dataprofilointi- ja laadunvarmistuskehys, joka on moderni ja monipuolinen työkalu, joka on suunniteltu ratkaisemaan tämä ongelma. Se erottaa sen samankaltaisista työkaluista sen kyky integroida saumattomasti Sparkiin ja hyödyntää hajautettua prosessointitehoa laajamittaisten tietojoukkojen tehokkaaseen käsittelyyn.
Kun kokeilet sitä, näet, kuinka sen joustavuus antaa sinun määrittää monimutkaiset validointisäännöt, jotka on räätälöity omiin tarpeisiisi, mikä varmistaa kattavan kattavuuden. Lisäksi Deequ sisältää laajat mittarit ja poikkeamien havaitsemisominaisuudet, jotka auttavat sinua tunnistamaan ja ennakoimaan tietojen laatuongelmia. Suurien ja dynaamisten tietojoukkojen parissa työskenteleville data-ammattilaisille Deequ on sveitsiläinen veitsiratkaisu. Katsotaan kuinka voimme käyttää sitä.
Lisätietoja Deequ-kirjaston asetuksista ja dataprofiloinnin käyttötapauksista on saatavilla täältä . Yksinkertaisuuden vuoksi tässä esimerkissä loimme vain muutaman lelutietueen:
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)
Useimmat tietosovellukset sisältävät implisiittisiä oletuksia tietojen attribuuteista, kuten ei-NULL-arvoista ja ainutlaatuisuudesta. Deequillä nämä oletukset tulevat selväksi yksikkötestien kautta. Tässä on joitain yleisiä tarkistuksia:
Rivien määrä: Varmista, että tietojoukko sisältää tietyn määrän rivejä.
Attribuuttien täydellisyys: Tarkista, että määritteet, kuten id ja productName, eivät koskaan ole NULL-arvoja.
Attribuuttien ainutlaatuisuus: Varmista, että tietyt määritteet, kuten id, ovat yksilöllisiä.
Arvoalue: Varmista, että attribuutit, kuten prioriteetti ja numViews, ovat odotettujen rajojen sisällä.
Pattern Matching: Varmista, että kuvaukset sisältävät URL-osoitteet, kun odotat.
Tilastolliset ominaisuudet: Varmista, että numeeristen attribuuttien mediaani täyttää tietyt kriteerit.
Näin voit toteuttaa nämä tarkistukset Deequillä:
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()
Näiden tarkistusten suorittamisen jälkeen Deequ muuntaa ne sarjaksi Spark-töitä, jotka se suorittaa laskeakseen mittareita tiedoista. Myöhemmin se kutsuu näiden mittareiden väitefunktioita (esim. _ == 5 koon tarkistukseen) nähdäkseen, pitävätkö rajoitukset dataa. Voimme tarkastaa objektin "verificationResult" nähdäksemme, löysikö testi virheitä:
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}") } }
Jos suoritamme esimerkin, saamme seuraavan tulosteen:
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!
Testissä havaittiin, että olettamuksiamme rikottiin! Vain 4 viidestä (80 %) productName-attribuutin arvoista ei ole nollaa, ja vain 2/5 (eli 40 %) description-attribuutin arvoista sisälsi URL-osoitteen. Onneksi teimme testin ja löysimme virheet; jonkun pitäisi korjata tiedot välittömästi!
Vaikka Deequ tarjoaa vankan kehyksen tietojen validointiin, tilastollisten menetelmien integrointi voi parantaa laadunvarmistustarkastuksiasi, varsinkin jos käsittelet tietojoukon aggregoituja mittareita. Katsotaanpa, kuinka voit käyttää tilastollisia menetelmiä tietojen laadun valvontaan ja varmistamiseen.
Harkitse liiketoimintaskenaariota, jossa ETL-prosessi (Extract, Transform, Load) tuottaa N tietuetta päivittäisestä ajoitetusta työstä. Tukitiimit saattavat haluta määrittää laadunvarmistustarkistuksia varoittaakseen, jos tietueiden määrässä on merkittävä poikkeama. Jos prosessi esimerkiksi luo tyypillisesti 9 500–10 500 tietuetta päivittäin kahden kuukauden aikana, mikä tahansa merkittävä lisäys tai lasku voi viitata taustalla oleviin tietoihin liittyvään ongelmaan.
Voimme käyttää tilastollista menetelmää määrittääksemme tämän kynnyksen, jonka perusteella prosessin tulisi antaa hälytys tukitiimille. Alla on esimerkki ennätysmäärän seurannasta kahden kuukauden ajalta:
Tämän analysoimiseksi voimme muuntaa tietueiden lukumäärätiedot tarkkailemaan päivittäisiä muutoksia. Nämä muutokset vaihtelevat yleensä nollan ympärillä, kuten seuraavasta kaaviosta näkyy:
Kun edustamme tätä muutosnopeutta normaalijakaumalla, se muodostaa kellokäyrän, joka osoittaa, että data jakautuu normaalisti. Odotettu muutos on noin 0 % keskihajonnan ollessa 2,63 %.
Tämä analyysi viittaa siihen, että ennätysmäärä on tyypillisesti -5,26 %:n ja +5,25 %:n välillä 90 %:n varmuudella. Tämän perusteella voit luoda säännön hälytyksen antamiseksi, jos tietueiden määrä poikkeaa tämän alueen yli, mikä varmistaa oikea-aikaisen puuttumisen.
Attribuutin kattavuus viittaa ei-NULL-arvojen suhteeseen tietojoukon tilannevedoksen tietueiden kokonaismäärään. Jos esimerkiksi kahdeksalla tietueesta 100 tietueesta on NULL-arvo tietylle määritteelle, kyseisen määritteen kattavuus on 92 %.
Tarkastellaan toista liiketoimintatapausta, jossa ETL-prosessi luo tuotetaulukon tilannekuvan päivittäin. Haluamme seurata tuotekuvauksen ominaisuuksien kattavuutta. Jos kattavuus alittaa tietyn kynnyksen, tukitiimille tulee tehdä hälytys. Alla on visuaalinen esitys tuotekuvausten määritteiden kattavuudesta kahden kuukauden ajalta:
Analysoimalla kattavuuden absoluuttisia päivittäisiä eroja havaitsemme, että muutokset värähtelevät nollan ympärillä:
Näiden tietojen esittäminen normaalijakaumana osoittaa, että se jakautuu normaalisti, odotetulla muutoksella noin 0 % ja keskihajonnan ollessa 2,45 %.
Kuten näemme, tämän tietojoukon tuotekuvauksen määritteen kattavuus vaihtelee tyypillisesti -4,9 %:sta +4,9 %:iin 90 %:n varmuudella. Tämän indikaattorin perusteella voimme asettaa säännön hälyttämään, jos kattavuus poikkeaa tämän alueen yli.
Jos käsittelet tietojoukkoja, joissa on merkittäviä vaihteluita kausivaihtelun tai trendien kaltaisten tekijöiden vuoksi, perinteiset tilastomenetelmät voivat laukaista vääriä hälytyksiä. Aikasarjaalgoritmit tarjoavat tarkemman lähestymistavan, mikä parantaa laadunvarmistustarkistusten tarkkuutta ja luotettavuutta.
Voit tuottaa järkevämpiä hälytyksiä käyttämällä joko
Mallitetaan Holt-Wintersillä päivittäistä myyntiä, jossa on sekä trendejä että kausiluonteisia malleja:
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)
Tällä menetelmällä voit havaita merkittäviä poikkeamia, jotka voivat viitata tietojen laatuongelmiin, mikä tarjoaa monipuolisemman lähestymistavan laadunvarmistustarkistuksiin.
Toivon, että tämä artikkeli auttaa sinua ottamaan tehokkaasti käyttöön suurien tietojoukkojen laadunvarmistustarkistuksia. Käyttämällä Deequ-kirjastoa ja integroimalla tilastollisia menetelmiä ja aikasarjaalgoritmeja voit varmistaa tietojen eheyden ja luotettavuuden, mikä parantaa viime kädessä tiedonhallintakäytäntöjäsi.
Yllä kuvattujen tekniikoiden käyttöönotto auttaa estämään mahdolliset ongelmat jatkosovelluksissa ja parantamaan tietotyönkulkujesi yleistä laatua.