![Search icon](https://hackernoon.imgix.net/search-new.png?w=19&h=19)
Youn nan ladrès enpòtan yon pwofesyonèl done akonpli se manyen efikas nan gwo datasets, asire bon jan kalite done ak fyab. Done se pati santral ak fondamantal nan nenpòt sistèm done, ak kèlkeswa bon konpetans ou genyen nan lòt aspè nan komès nou an, sa a se youn ou pa gen mwayen pou neglije.
Nan atik sa a, mwen eksplore teknik solid pou fè chèk QA sou gwo datasets lè l sèvi avèk bibliyotèk Deequ ak metòd estatistik. Lè w konbine apwòch mwen eksplike anba a, ou pral kapab kenbe entegrite done yo, amelyore pratik jesyon done ou yo, epi anpeche pwoblèm potansyèl nan aplikasyon en.
Asire bon jan kalite done nan echèl se yon travay redoutable, espesyalman lè w ap fè fas ak dè milya de ranje ki estoke nan sistèm dosye distribye oswa depo done. Bibliyotèk Deequ la se yon sous louvri pwofil done ak kad QA ki bati sou Spark ki se yon zouti modèn ak versatile ki fèt pou rezoud pwoblèm sa a. Ki sa ki fè li apa de zouti menm jan an se kapasite li nan entegre san pwoblèm ak Spark, swe pouvwa distribiye pwosesis pou manyen efikas nan seri done gwo echèl.
Lè ou eseye li, ou pral wè ki jan fleksibilite li pèmèt ou defini règleman validation konplèks ki adapte a kondisyon espesifik ou yo, asire pwoteksyon konplè. Anplis de sa, Deequ gen anpil mezi ak kapasite deteksyon anomali ki pral ede w idantifye ak abòde pwoblèm kalite done yo. Pou pwofesyonèl done k ap travay ak seri done gwo ak dinamik, Deequ se yon solisyon kouto Swis. Ann wè ki jan nou ka sèvi ak li.
Plis detay sou konfigirasyon bibliyotèk Deequ ak ka itilize alantou profil done yo aksesib isit la . Pou dedomajman pou senplisite, nan egzanp sa a, nou jis pwodwi kèk dosye jwèt:
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)
Pifò aplikasyon done yo vini ak sipozisyon implicite sou atribi done yo, tankou valè ki pa NULL ak singularité. Avèk Deequ, sipozisyon sa yo vin klè atravè tès inite yo. Men kèk chèk komen:
Konte Ranje: Asire ke seri done a gen yon kantite espesifik ranje.
Atribi konplè: Tcheke ke atribi tankou id ak productName pa janm NULL.
Singularité atribi: Asire ke sèten atribi, tankou id, inik.
Ranje Valè: Valide ke atribi tankou priyorite ak numViews tonbe nan chenn yo atann.
Matching Modèl: Verifye ke deskripsyon yo gen URL lè yo espere.
Pwopriyete Estatistik: Asire medyàn atribi nimerik yo satisfè kritè espesifik yo.
Men ki jan ou ka aplike chèk sa yo lè l sèvi avèk 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()
Apre yo fin fè chèk sa yo, Deequ tradui yo nan yon seri travay Spark, ke li egzekite pou kalkile mezi sou done yo. Apre sa, li envoke fonksyon afimasyon ou yo (pa egzanp, _ == 5 pou chèk gwosè a) sou mezi sa yo pou wè si kontrent yo kenbe sou done yo. Nou ka enspekte objè "verificationResult" pou wè si tès la te jwenn erè:
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}") } }
Si nou kouri egzanp lan, nou jwenn pwodiksyon sa a:
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!
Tès la te jwenn ke sipozisyon nou yo te vyole! Se sèlman 4 sou 5 (80%) valè atribi productName ki pa nil, epi sèlman 2 sou 5 (sa vle di, 40%) valè atribi deskripsyon an te genyen yon URL. Erezman, nou te fè yon tès epi nou te jwenn erè yo; yon moun ta dwe imedyatman ranje done yo!
Pandan ke Deequ ofri yon fondasyon solid pou validation done, entegre metòd estatistik ka amelyore plis chèk QA ou yo, espesyalman si w ap fè fas ak mezi total nan yon seri done. Ann wè ki jan ou ka anplwaye metòd estatistik pou kontwole ak asire bon jan kalite done yo.
Konsidere yon senaryo biznis kote yon pwosesis ETL (ekstrè, transfòme, chaj) pwodui N dosye sou yon travay pwograme chak jou. Ekip sipò yo ka vle mete chèk QA pou ogmante yon alèt si gen yon devyasyon enpòtan nan konte dosye a. Pou egzanp, si pwosesis la tipikman jenere ant 9,500 a 10,500 dosye chak jou sou de mwa, nenpòt ogmantasyon oswa diminisyon enpòtan ka endike yon pwoblèm ak done yo kache.
Nou ka itilize yon metòd estatistik pou defini papòt sa a sou ki pwosesis ta dwe leve yon alèt nan ekip sipò a. Anba la a se yon ilistrasyon pou swiv konte dosye sou de mwa:
Pou analize sa a, nou ka transfòme done konte dosye yo pou obsève chanjman chak jou yo. Chanjman sa yo jeneralman osile alantou zewo, jan yo montre nan tablo sa a:
Lè nou reprezante to chanjman sa a ak yon distribisyon nòmal, li fòme yon koub klòch, ki endike ke done yo distribye nòmalman. Chanjman espere se anviwon 0%, ak yon devyasyon estanda 2.63%.
Analiz sa a sijere ke konte dosye a anjeneral tonbe nan -5.26% a + 5.25% ranje ak 90% konfyans. Dapre sa a, ou ka etabli yon règ pou leve yon alèt si konte dosye a devye pi lwen pase ranje sa a, asire entèvansyon alè.
Kouvèti atribi refere a rapò valè ki pa NULL ak kantite total dosye pou yon snapshot ansanm done. Pa egzanp, si 8 sou 100 dosye gen yon valè NULL pou yon atribi an patikilye, pwoteksyon pou atribi sa a se 92%.
Ann revize yon lòt ka biznis ak yon pwosesis ETL jenere yon snapshot tab pwodwi chak jou. Nou vle kontwole pwoteksyon atribi deskripsyon pwodwi yo. Si pwoteksyon an tonbe anba yon sèten papòt, yon alèt ta dwe leve pou ekip sipò a. Anba a se yon reprezantasyon vizyèl pwoteksyon atribi pou deskripsyon pwodwi sou de mwa:
Lè nou analize diferans absoli chak jou nan kouvèti asirans, nou obsève ke chanjman yo osile alantou zewo:
Reprezante done sa yo kòm yon distribisyon nòmal montre ke li se nòmalman distribye ak yon chanjman espere nan alantou 0% ak yon devyasyon estanda nan 2.45%.
Kòm nou wè, pou seri done sa a, pwoteksyon atribi deskripsyon pwodwi a anjeneral varye ant -4.9% ak +4.9% ak 90% konfyans. Dapre endikatè sa a, nou ka mete yon règ pou ogmante yon alèt si pwoteksyon an devye pi lwen pase ranje sa a.
Si w ap travay ak done ki montre varyasyon enpòtan akòz faktè tankou sezonye oswa tandans, metòd estatistik tradisyonèl yo ka deklanche fo alèt. Algoritm seri tan yo ofri yon apwòch pi rafine, amelyore presizyon ak fyab chèk QA ou yo.
Pou pwodwi alèt ki pi sansib, ou ka itilize swa a
Ann mock-modèl lavant chak jou ki montre tou de tandans ak modèl sezon lè l sèvi avèk 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)
Sèvi ak metòd sa a, ou ka detekte devyasyon enpòtan ki ta ka endike pwoblèm kalite done, bay yon apwòch plis nuans nan chèk QA.
Mwen espere ke atik sa a pral ede w byen aplike chèk QA pou gwo done ou yo. Lè w itilize bibliyotèk Deequ ak entegre metòd estatistik ak algoritm seri tan, ou ka asire entegrite done ak fyab, finalman amelyore pratik jesyon done ou yo.
Aplike teknik ki dekri pi wo a pral ede w anpeche pwoblèm potansyèl nan aplikasyon en epi amelyore kalite an jeneral nan workflows done ou yo.