![Search icon](https://hackernoon.imgix.net/search-new.png?w=19&h=19)
Een van de essentiële vaardigheden van een ervaren dataprofessional is het effectief omgaan met grote datasets, waarbij de datakwaliteit en betrouwbaarheid worden gewaarborgd. Data is het centrale en fundamentele onderdeel van elk datasysteem, en welke goede vaardigheden u ook hebt in andere aspecten van ons vak, dit is er een die u niet kunt negeren.
In dit artikel verken ik robuuste technieken voor het uitvoeren van QA-controles op grote datasets met behulp van de Deequ-bibliotheek en statistische methoden. Door de benaderingen die ik hieronder uitleg te combineren, kunt u de integriteit van gegevens behouden, uw gegevensbeheerpraktijken verbeteren en potentiële problemen in downstream-toepassingen voorkomen.
Het waarborgen van datakwaliteit op schaal is een ontmoedigende taak, vooral wanneer u te maken hebt met miljarden rijen die zijn opgeslagen in gedistribueerde bestandssystemen of datawarehouses. De Deequ-bibliotheek is een open-source dataprofilerings- en QA-framework dat is gebouwd op Spark en een moderne en veelzijdige tool is die is ontworpen om dit probleem op te lossen. Wat het onderscheidt van vergelijkbare tools is de mogelijkheid om naadloos te integreren met Spark, waarbij gebruik wordt gemaakt van gedistribueerde verwerkingskracht voor efficiënte verwerking van grootschalige datasets.
Wanneer u het uitprobeert, zult u zien hoe de flexibiliteit u in staat stelt om complexe validatieregels te definiëren die zijn afgestemd op uw specifieke vereisten, wat zorgt voor een uitgebreide dekking. Bovendien beschikt Deequ over uitgebreide metrische gegevens en anomaliedetectiemogelijkheden die u helpen om problemen met de datakwaliteit te identificeren en proactief aan te pakken. Voor dataprofessionals die werken met grote en dynamische datasets, is Deequ een Zwitserse zakmesoplossing. Laten we eens kijken hoe we het kunnen gebruiken.
Meer details over de Deequ-bibliotheekopstelling en use cases rondom dataprofilering zijn hier toegankelijk. Voor de eenvoud hebben we in dit voorbeeld slechts een paar speelgoedrecords gegenereerd:
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)
De meeste data-applicaties worden geleverd met impliciete aannames over data-attributen, zoals non-NULL-waarden en uniciteit. Met Deequ worden deze aannames expliciet via unit-tests. Hier zijn enkele veelvoorkomende controles:
Rijaantal: Zorg ervoor dat de dataset een specifiek aantal rijen bevat.
Volledigheid van kenmerken: controleer of kenmerken zoals id en productName nooit NULL zijn.
Uniekheid van kenmerken: zorg ervoor dat bepaalde kenmerken, zoals id, uniek zijn.
Waardebereik: Valideer of kenmerken zoals prioriteit en numViews binnen de verwachte bereiken vallen.
Patroonherkenning: controleer of beschrijvingen URL's bevatten wanneer dat verwacht wordt.
Statistische eigenschappen: Zorg ervoor dat de mediaan van numerieke kenmerken aan specifieke criteria voldoet.
Hier ziet u hoe u deze controles kunt implementeren met 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()
Nadat deze controles zijn uitgevoerd, vertaalt Deequ ze naar een reeks Spark-taken, die het uitvoert om metrische gegevens op de gegevens te berekenen. Daarna roept het uw assertiefuncties aan (bijv. _ == 5 voor de groottecontrole) op deze metrische gegevens om te zien of de beperkingen gelden voor de gegevens. We kunnen het object "verificationResult" inspecteren om te zien of de test fouten heeft gevonden:
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}") } }
Als we het voorbeeld uitvoeren, krijgen we de volgende uitvoer:
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!
De test wees uit dat onze aannames werden geschonden! Slechts 4 van de 5 (80%) waarden van het productName-attribuut zijn niet-null en slechts 2 van de 5 (d.w.z. 40%) waarden van het description-attribuut bevatten een URL. Gelukkig hebben we een test uitgevoerd en de fouten gevonden; iemand zou de gegevens onmiddellijk moeten repareren!
Hoewel Deequ een robuust raamwerk biedt voor datavalidatie, kan het integreren van statistische methoden uw QA-controles verder verbeteren, vooral als u te maken hebt met geaggregeerde statistieken van een dataset. Laten we eens kijken hoe u statistische methoden kunt gebruiken om de datakwaliteit te bewaken en te waarborgen.
Denk aan een bedrijfsscenario waarin een ETL-proces (Extract, Transform, Load) N records produceert op een dagelijkse geplande taak. Ondersteuningsteams willen mogelijk QA-controles instellen om een waarschuwing te genereren als er een significante afwijking is in het recordaantal. Als het proces bijvoorbeeld doorgaans dagelijks tussen de 9.500 en 10.500 records genereert gedurende twee maanden, kan elke significante toename of afname duiden op een probleem met de onderliggende gegevens.
We kunnen een statistische methode gebruiken om deze drempel te definiëren waarop het proces een waarschuwing moet geven aan het supportteam. Hieronder ziet u een illustratie van het bijhouden van het aantal records gedurende twee maanden:
Om dit te analyseren, kunnen we de recordtellingsgegevens transformeren om de dagelijkse veranderingen te observeren. Deze veranderingen schommelen over het algemeen rond nul, zoals weergegeven in de volgende grafiek:
Wanneer we deze veranderingssnelheid weergeven met een normale verdeling, vormt het een klokvormige curve, wat aangeeft dat de data normaal verdeeld is. De verwachte verandering is ongeveer 0%, met een standaarddeviatie van 2,63%.
Deze analyse suggereert dat het recordaantal doorgaans binnen het bereik van -5,26% tot +5,25% valt met 90% zekerheid. Op basis hiervan kunt u een regel instellen om een waarschuwing te geven als het recordaantal buiten dit bereik afwijkt, waardoor tijdig ingrijpen wordt gegarandeerd.
Attribuutdekking verwijst naar de verhouding van niet-NULL-waarden tot het totale recordaantal voor een momentopname van een dataset. Als bijvoorbeeld 8 van de 100 records een NULL-waarde hebben voor een bepaald attribuut, is de dekking voor dat attribuut 92%.
Laten we een andere businesscase bekijken met een ETL-proces dat dagelijks een momentopname van een producttabel genereert. We willen de dekking van productbeschrijvingskenmerken bewaken. Als de dekking onder een bepaalde drempelwaarde komt, moet er een waarschuwing worden afgegeven aan het supportteam. Hieronder ziet u een visuele weergave van de dekking van kenmerken voor productbeschrijvingen gedurende twee maanden:
Door de absolute dagelijkse verschillen in dekking te analyseren, zien we dat de veranderingen rond nul schommelen:
Als we deze gegevens als een normale verdeling weergeven, zien we dat deze normaal verdeeld is, met een verwachte verandering van ongeveer 0% en een standaarddeviatie van 2,45%.
Zoals we zien, varieert de dekking van het productbeschrijvingskenmerk voor deze dataset doorgaans van -4,9% tot +4,9% met een betrouwbaarheid van 90%. Op basis van deze indicator kunnen we een regel instellen om een waarschuwing te geven als de dekking buiten dit bereik afwijkt.
Als u werkt met datasets die significante variaties vertonen vanwege factoren zoals seizoensgebondenheid of trends, kunnen traditionele statistische methoden valse waarschuwingen veroorzaken. Tijdreeksalgoritmen bieden een verfijndere aanpak, waardoor de nauwkeurigheid en betrouwbaarheid van uw QA-controles worden verbeterd.
Om zinvollere waarschuwingen te produceren, kunt u de volgende opties gebruiken:
Laten we een model maken van de dagelijkse verkopen die zowel trend- als seizoenspatronen vertonen met behulp van 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)
Met deze methode kunt u aanzienlijke afwijkingen detecteren die kunnen wijzen op problemen met de gegevenskwaliteit. Zo krijgt u een genuanceerdere aanpak van QA-controles.
Ik hoop dat dit artikel u zal helpen QA-controles efficiënt te implementeren voor uw grote datasets. Door de Deequ-bibliotheek te gebruiken en statistische methoden en tijdreeksalgoritmen te integreren, kunt u de integriteit en betrouwbaarheid van gegevens garanderen, wat uiteindelijk uw gegevensbeheerpraktijken verbetert.
Door de hierboven beschreven technieken te implementeren, voorkomt u mogelijke problemen in downstream-toepassingen en verbetert u de algehele kwaliteit van uw gegevensworkflows.