Een van die noodsaaklike vaardighede van 'n bekwame data-professional is die effektiewe hantering van groot datastelle, wat datakwaliteit en betroubaarheid verseker. Data is die sentrale en fundamentele deel van enige datastelsel, en watter goeie vaardighede jy ook al in ander aspekte van ons handel het, dit is een wat jy nie kan bekostig om oor die hoof te sien nie.
In hierdie artikel ondersoek ek robuuste tegnieke om QA-kontroles op groot datastelle uit te voer deur die Deequ-biblioteek en statistiese metodes te gebruik. Deur die benaderings wat ek hieronder verduidelik te kombineer, sal jy in staat wees om data-integriteit te handhaaf, jou databestuurspraktyke te verbeter en potensiële probleme in stroomaf toepassings te voorkom.
Om datakwaliteit op skaal te verseker, is 'n uitdagende taak, veral wanneer ons handel oor miljarde rye wat in verspreide lêerstelsels of datapakhuise gestoor word. Die Deequ-biblioteek is 'n oopbron-dataprofilering en QA-raamwerk gebou op Spark wat 'n moderne en veelsydige hulpmiddel is wat ontwerp is om hierdie probleem op te los. Wat dit van soortgelyke instrumente onderskei, is sy vermoë om naatloos met Spark te integreer, deur gebruik te maak van verspreide verwerkingskrag vir doeltreffende hantering van grootskaalse datastelle.
Wanneer jy dit probeer, sal jy sien hoe die buigsaamheid daarvan jou in staat stel om komplekse valideringsreëls te definieer wat aangepas is vir jou spesifieke vereistes, wat omvattende dekking verseker. Boonop beskik Deequ oor uitgebreide statistieke en anomalie-opsporingsvermoëns wat jou sal help om datakwaliteitkwessies te identifiseer en proaktief aan te spreek. Vir data-professionals wat met groot en dinamiese datastelle werk, is Deequ 'n Switserse mes-oplossing. Kom ons kyk hoe ons dit kan gebruik.
Meer besonderhede oor die Deequ-biblioteekopstelling en gebruiksgevalle rondom dataprofilering is hier toeganklik. Ter wille van eenvoud, in hierdie voorbeeld het ons net 'n paar speelgoedrekords gegenereer:
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)
Die meeste datatoepassings kom met implisiete aannames oor data-kenmerke, soos nie-NULL waardes en uniekheid. Met Deequ word hierdie aannames eksplisiet deur middel van eenheidstoetse. Hier is 'n paar algemene kontrole:
Rytelling: Maak seker dat die datastel 'n spesifieke aantal rye bevat.
Eienskap volledigheid: Kontroleer dat eienskappe soos id en produknaam nooit NULL is nie.
Eienskap Uniekheid: Maak seker dat sekere eienskappe, soos id, uniek is.
Waardereeks: Bevestig dat kenmerke soos prioriteit en numViews binne verwagte reekse val.
Patroonpassing: Verifieer dat beskrywings URL's bevat wanneer dit verwag word.
Statistiese eienskappe: Maak seker dat die mediaan van numeriese eienskappe aan spesifieke kriteria voldoen.
Hier is hoe jy hierdie kontroles kan implementeer met behulp van 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 hierdie kontroles uitgevoer is, vertaal Deequ dit in 'n reeks Spark-take, wat dit uitvoer om statistieke op die data te bereken. Daarna roep dit jou beweringsfunksies op (bv. _ == 5 vir die groottekontrole) op hierdie metrieke om te sien of die beperkings op die data hou. Ons kan die voorwerp "verificationResult" inspekteer om te sien of die toets foute gevind het:
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}") } }
As ons die voorbeeld uitvoer, kry ons die volgende uitset:
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!
Die toets het bevind dat ons aannames geskend is! Slegs 4 uit 5 (80%) van die waardes van die produknaam-kenmerk is nie-nul, en slegs 2 uit 5 (dws 40%) waardes van die beskrywing-kenmerk het wel 'n URL bevat. Gelukkig het ons 'n toets gedoen en die foute gevind; iemand moet dadelik die data regmaak!
Terwyl Deequ 'n robuuste raamwerk vir datavalidering bied, kan die integrasie van statistiese metodes jou QA-kontroles verder verbeter, veral as jy te doen het met saamgestelde statistieke van 'n datastel. Kom ons kyk hoe jy statistiese metodes kan gebruik om datakwaliteit te monitor en te verseker.
Oorweeg 'n besigheidsscenario waar 'n ETL (Extract, Transform, Load) proses N rekords op 'n daaglikse geskeduleerde werk produseer. Ondersteuningspanne wil dalk QA-tjeks opstel om 'n waarskuwing te maak as daar 'n beduidende afwyking in die rekordtelling is. Byvoorbeeld, as die proses gewoonlik tussen 9 500 tot 10 500 rekords daagliks oor twee maande genereer, kan enige beduidende toename of afname 'n probleem met die onderliggende data aandui.
Ons kan 'n statistiese metode gebruik om hierdie drempel te definieer oor watter proses 'n waarskuwing aan die ondersteuningspan moet gee. Hieronder is 'n illustrasie van rekordtelling oor twee maande:
Om dit te ontleed, kan ons die rekordtellingdata transformeer om die dag-tot-dag veranderinge waar te neem. Hierdie veranderinge ossilleer gewoonlik rondom nul, soos getoon in die volgende grafiek:
Wanneer ons hierdie tempo van verandering met 'n normaalverspreiding voorstel, vorm dit 'n klokkurwe, wat aandui dat die data normaal versprei is. Die verwagte verandering is ongeveer 0%, met 'n standaardafwyking van 2.63%.
Hierdie ontleding dui daarop dat die rekordtelling tipies binne die -5.26% tot +5.25% reeks val met 90% vertroue. Op grond hiervan kan jy 'n reël daarstel om 'n waarskuwing te gee as die rekordtelling buite hierdie reeks afwyk, wat tydige ingryping verseker.
Eienskapdekking verwys na die verhouding van nie-NULL waardes tot die totale rekordtelling vir 'n datastel momentopname. Byvoorbeeld, as 8 uit 100 rekords 'n NULL-waarde vir 'n spesifieke kenmerk het, is die dekking vir daardie kenmerk 92%.
Kom ons hersien nog 'n besigheidsgeval met 'n ETL-proses wat daagliks 'n produktabel-momentopname genereer. Ons wil die dekking van produkbeskrywing-kenmerke monitor. As die dekking onder 'n sekere drempel val, moet 'n waarskuwing vir die ondersteuningspan gemaak word. Hieronder is 'n visuele voorstelling van kenmerkdekking vir produkbeskrywings oor twee maande:
Deur die absolute dag-tot-dag verskille in dekking te ontleed, neem ons waar dat die veranderinge rondom nul ossilleer:
Deur hierdie data as 'n normale verspreiding voor te stel, wys dit dat dit normaalverspreid is met 'n verwagte verandering van ongeveer 0% en 'n standaardafwyking van 2.45%.
Soos ons sien, wissel die produkbeskrywing-kenmerkdekking vir hierdie datastel tipies van -4.9% tot +4.9% met 90% vertroue. Gebaseer op hierdie aanwyser, kan ons 'n reël stel om 'n waarskuwing te gee as die dekking buite hierdie reeks afwyk.
As jy met datastelle werk wat beduidende variasies toon as gevolg van faktore soos seisoenaliteit of neigings, kan tradisionele statistiese metodes vals waarskuwings veroorsaak. Tydreeksalgoritmes bied 'n meer verfynde benadering, wat die akkuraatheid en betroubaarheid van jou QA-tjeks verbeter.
Om meer sinvolle waarskuwings te produseer, kan jy óf die
Kom ons modelleer daaglikse verkope wat beide neiging en seisoenale patrone vertoon 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)
Deur hierdie metode te gebruik, kan jy beduidende afwykings opspoor wat kan dui op datakwaliteitkwessies, wat 'n meer genuanseerde benadering tot QA-kontroles bied.
Ek hoop dat hierdie artikel jou sal help om QA-kontroles doeltreffend vir jou groot datastelle te implementeer. Deur die Deequ-biblioteek te gebruik en statistiese metodes en tydreeksalgoritmes te integreer, kan jy data-integriteit en betroubaarheid verseker, wat uiteindelik jou databestuurspraktyke verbeter.
Die implementering van die tegnieke wat hierbo beskryf word, sal jou help om potensiële probleme in stroomaf-toepassings te voorkom en die algehele kwaliteit van jou data-werkvloei te verbeter.