![Search icon](https://hackernoon.imgix.net/search-new.png?w=19&h=19)
En av de viktigaste färdigheterna hos en skicklig dataproffs är effektiv hantering av stora datamängder, vilket säkerställer datakvalitet och tillförlitlighet. Data är den centrala och grundläggande delen av alla datasystem, och vilka goda kunskaper du än har inom andra aspekter av vår handel, är detta en du inte har råd att förbise.
I den här artikeln utforskar jag robusta tekniker för att utföra kvalitetskontroller av stora datamängder med hjälp av Deequ-biblioteket och statistiska metoder. Genom att kombinera tillvägagångssätten jag förklarar nedan kommer du att kunna upprätthålla dataintegritet, förbättra dina datahanteringsmetoder och förhindra potentiella problem i nedströmsapplikationer.
Att säkerställa datakvalitet i stor skala är en skrämmande uppgift, särskilt när man hanterar miljarder rader lagrade i distribuerade filsystem eller datalager. Deequ-biblioteket är ett ramverk för dataprofilering och QA med öppen källkod byggt på Spark som är ett modernt och mångsidigt verktyg utformat för att lösa detta problem. Det som skiljer den från liknande verktyg är dess förmåga att integreras sömlöst med Spark och utnyttja distribuerad processorkraft för effektiv hantering av storskaliga datamängder.
När du provar det kommer du att se hur dess flexibilitet låter dig definiera komplexa valideringsregler som är skräddarsydda för dina specifika krav, vilket säkerställer en omfattande täckning. Dessutom har Deequ omfattande mätvärden och funktioner för upptäckt av anomalier som hjälper dig att identifiera och proaktivt ta itu med datakvalitetsproblem. För dataproffs som arbetar med stora och dynamiska datamängder är Deequ en schweizisk knivlösning. Låt oss se hur vi kan använda det.
Mer information om Deequ-bibliotekets inställningar och användningsfall kring dataprofilering finns här . För enkelhetens skull genererade vi i det här exemplet bara några leksaksposter:
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 flesta dataapplikationer kommer med implicita antaganden om dataattribut, såsom icke-NULL-värden och unikhet. Med Deequ blir dessa antaganden explicita genom enhetstester. Här är några vanliga kontroller:
Antal rader: Se till att datamängden innehåller ett specifikt antal rader.
Attributfullständighet: Kontrollera att attribut som id och produktnamn aldrig är NULL.
Attribut Uniqueness: Se till att vissa attribut, som id, är unika.
Värdeintervall: Verifiera att attribut som prioritet och numViews faller inom förväntade intervall.
Mönstermatchning: Kontrollera att beskrivningar innehåller webbadresser när de förväntas.
Statistiska egenskaper: Se till att medianen för numeriska attribut uppfyller specifika kriterier.
Så här kan du implementera dessa kontroller med 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()
Efter att ha kört dessa kontroller översätter Deequ dem till en serie Spark-jobb, som den utför för att beräkna mätvärden på data. Efteråt anropar den dina påståendefunktioner (t.ex. _ == 5 för storlekskontrollen) på dessa mätvärden för att se om begränsningarna håller på data. Vi kan inspektera objektet "verificationResult" för att se om testet hittade fel:
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}") } }
Om vi kör exemplet får vi följande utdata:
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!
Testet visade att våra antaganden bröts! Endast 4 av 5 (80 %) av värdena för attributet productName är icke-null, och endast 2 av 5 (dvs. 40 %) värden i attributet description innehöll en URL. Lyckligtvis körde vi ett test och hittade felen; någon borde omedelbart fixa datan!
Även om Deequ erbjuder ett robust ramverk för datavalidering, kan integration av statistiska metoder ytterligare förbättra dina kvalitetskontroller, särskilt om du har att göra med aggregerade mätvärden för en datamängd. Låt oss se hur du kan använda statistiska metoder för att övervaka och säkerställa datakvalitet.
Tänk på ett affärsscenario där en ETL-process (Extract, Transform, Load) producerar N poster på ett dagligt schemalagt jobb. Supportteam kan vilja ställa in QA-kontroller för att larma om det finns en betydande avvikelse i postantalet. Till exempel, om processen vanligtvis genererar mellan 9 500 till 10 500 poster dagligen under två månader, kan varje betydande ökning eller minskning tyda på ett problem med den underliggande informationen.
Vi kan använda en statistisk metod för att definiera denna tröskel för vilken process som ska göra en varning till supportteamet. Nedan är en illustration av spårning av rekordantal under två månader:
För att analysera detta kan vi transformera posträkningsdata för att observera de dagliga förändringarna. Dessa förändringar pendlar vanligtvis runt noll, som visas i följande diagram:
När vi representerar denna förändringshastighet med en normalfördelning, bildar den en klockkurva, vilket indikerar att data är normalt fördelad. Den förväntade förändringen är cirka 0 %, med en standardavvikelse på 2,63 %.
Denna analys tyder på att rekordantalet typiskt faller inom intervallet -5,26 % till +5,25 % med 90 % konfidens. Baserat på detta kan du upprätta en regel för att larma om postantalet avviker utanför detta intervall, vilket säkerställer snabba ingripanden.
Attributtäckning hänvisar till förhållandet mellan icke-NULL-värden och det totala postantalet för en datauppsättning ögonblicksbild. Till exempel, om 8 av 100 poster har ett NULL-värde för ett visst attribut, är täckningen för det attributet 92 %.
Låt oss granska ett annat affärscase med en ETL-process som genererar en ögonblicksbild av produkttabellen dagligen. Vi vill övervaka täckningen av produktbeskrivningsattribut. Om täckningen faller under en viss tröskel bör en varning höjas för supportteamet. Nedan är en visuell representation av attributtäckning för produktbeskrivningar under två månader:
Genom att analysera de absoluta dag-till-dag skillnaderna i täckning, observerar vi att förändringarna pendlar runt noll:
Att representera dessa data som en normalfördelning visar att det är normalfördelat med en förväntad förändring på cirka 0 % och en standardavvikelse på 2,45 %.
Som vi ser, för denna datauppsättning varierar produktbeskrivningsattributtäckningen vanligtvis från -4,9 % till +4,9 % med 90 % konfidens. Baserat på denna indikator kan vi ställa in en regel för att larma om täckningen avviker utanför detta intervall.
Om du arbetar med datauppsättningar som visar betydande variationer på grund av faktorer som säsongsvariationer eller trender, kan traditionella statistiska metoder utlösa falska varningar. Tidsseriealgoritmer erbjuder ett mer förfinat tillvägagångssätt, vilket förbättrar noggrannheten och tillförlitligheten av dina QA-kontroller.
För att producera mer vettiga varningar kan du använda antingen
Låt oss modellera daglig försäljning som uppvisar både trend- och säsongsmönster med hjälp av 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)
Med den här metoden kan du upptäcka betydande avvikelser som kan tyda på datakvalitetsproblem, vilket ger en mer nyanserad metod för kvalitetskontroller.
Jag hoppas att den här artikeln hjälper dig att effektivt implementera kvalitetskontroller för dina stora datamängder. Genom att använda Deequ-biblioteket och integrera statistiska metoder och tidsseriealgoritmer kan du säkerställa dataintegritet och tillförlitlighet, vilket i slutändan förbättrar dina datahanteringsmetoder.
Genom att implementera teknikerna som beskrivs ovan hjälper du dig att förhindra potentiella problem i nedströmsapplikationer och förbättra den övergripande kvaliteten på dina dataarbetsflöden.