Яке аз малакаҳои муҳими як мутахассиси ботаҷриба ин коркарди самараноки маҷмӯи додаҳои калон, таъмини сифат ва эътимоднокии додаҳо мебошад. Маълумот ҷузъи марказӣ ва бунёдии ҳама гуна системаи додаҳо мебошад ва новобаста аз он, ки шумо дар дигар ҷанбаҳои тиҷорати мо малакаҳои хуб доред, ин як чизест, ки шумо наметавонед онро нодида гиред.
Дар ин мақола, ман усулҳои боэътимоди гузаронидани санҷишҳои QA дар маҷмӯи додаҳои калон бо истифода аз китобхонаи Deequ ва усулҳои оморӣ меомӯзам. Бо омезиши равишҳое, ки ман дар зер шарҳ медиҳам, шумо метавонед якпорчагии маълумотро нигоҳ доред, таҷрибаҳои идоракунии додаҳои худро такмил диҳед ва мушкилоти эҳтимолиро дар барномаҳои поёноб пешгирӣ кунед.
Таъмини сифати маълумот дар миқёс як вазифаи душвор аст, махсусан ҳангоми кор бо миллиардҳо сатрҳо, ки дар системаҳои файлии тақсимшуда ё анборҳои додаҳо нигоҳ дошта мешаванд. Китобхонаи Deequ як профили кушодаи додаҳо ва чаҳорчӯбаи QA мебошад, ки дар Spark сохта шудааст, ки як абзори муосир ва бисёрҷонибаест, ки барои ҳалли ин мушкилот пешбинӣ шудааст. Он чизе, ки онро аз абзорҳои шабеҳ фарқ мекунад, қобилияти ҳамгироии бефосила бо Spark мебошад, ки аз қувваи коркарди тақсимшуда барои коркарди самараноки маҷмӯаҳои калонҳаҷм истифода мешавад.
Вақте ки шумо онро санҷед, шумо хоҳед дид, ки чӣ гуна чандирии он ба шумо имкон медиҳад, ки қоидаҳои мураккаби тасдиқкуниро, ки ба талаботи мушаххаси шумо мутобиқ карда шудаанд, муайян кунед ва фарогирии ҳамаҷонибаро таъмин кунед. Илова бар ин, Deequ дорои ченакҳои васеъ ва қобилиятҳои муайянкунии аномалия мебошад, ки ба шумо барои муайян ва ҳалли фаъолонаи масъалаҳои сифати маълумот кӯмак мерасонанд. Барои мутахассисони додаҳо, ки бо маҷмӯи додаҳои калон ва динамикӣ кор мекунанд, Deequ як ҳалли корди швейтсарӣ мебошад. Биёед бубинем, ки чӣ тавр мо онро истифода бурда метавонем.
Тафсилоти бештар дар бораи танзими китобхонаи Deequ ва ҳолатҳои истифода дар атрофи профили додаҳо дар ин ҷо дастрасанд. Ба хотири соддагӣ, дар ин мисол, мо танҳо чанд сабти бозичаро тавлид кардем:
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)
Аксари замимаҳои додаҳо бо пиндоштҳои номуайян дар бораи атрибутҳои додаҳо, ба монанди арзишҳои ғайри NULL ва беназирӣ меоянд. Бо Deequ, ин пиндоштҳо тавассути санҷишҳои воҳидҳо равшан мешаванд. Инҳоянд чанд санҷишҳои умумӣ:
Шумораи сатрҳо: Боварӣ ҳосил кунед, ки маҷмӯи маълумот шумораи муайяни сатрҳоро дар бар мегирад.
Мукаммалии хосият: Санҷед, ки атрибутҳо ба монанди id ва productName ҳеҷ гоҳ NULL нестанд.
Нодир будани атрибут: Боварӣ ҳосил кунед, ки атрибутҳои муайян, ба монанди id, беназиранд.
Диапазони арзиш: Тасдиқ кунед, ки атрибутҳо ба монанди афзалият ва numViews ба диапазони пешбинишуда дохил мешаванд.
Мутобиқсозии намуна: Боварӣ ҳосил кунед, ки тавсифҳо ҳангоми интизорӣ URL-ҳо доранд.
Хусусиятҳои оморӣ: Боварӣ ҳосил кунед, ки миёнаравии атрибутҳои ададӣ ба меъёрҳои мушаххас мувофиқат мекунад.
Ин аст, ки чӣ тавр шумо метавонед ин чекҳоро бо истифода аз 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()
Пас аз анҷом додани ин санҷишҳо, Deequ онҳоро ба як қатор корҳои Spark тарҷума мекунад, ки онро барои ҳисоб кардани ченакҳо дар маълумот иҷро мекунад. Пас аз он, он функсияҳои тасдиқи шуморо (масалан, _ == 5 барои санҷиши андоза) дар ин ченакҳо истифода мебарад, то бубинад, ки оё маҳдудиятҳо дар маълумот нигоҳ дошта мешаванд. Мо метавонем объекти "verificationResult" -ро тафтиш кунем, то бубинем, ки оё санҷиш хатогиҳоро пайдо кардааст:
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}") } }
Агар мо мисолро иҷро кунем, мо натиҷаи зеринро мегирем:
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!
Санҷиш нишон дод, ки пиндоштҳои мо вайрон шудаанд! Танҳо 4 аз 5 (80%) аз арзишҳои аттрибутҳои productName ғайримуқаррарӣ мебошанд ва танҳо 2 аз 5 адад (яъне 40%) арзиши атрибути тавсиф URL-ро дар бар мегирад. Хушбахтона, мо санҷиш гузаронидем ва хатогиҳоро ёфтем; касе бояд фавран маълумотро ислоҳ кунад!
Дар ҳоле ки Deequ чаҳорчӯбаи мустаҳкамро барои тасдиқи маълумот пешниҳод мекунад, ҳамгироии усулҳои оморӣ метавонад санҷишҳои QA-и шуморо боз ҳам беҳтар созад, хусусан агар шумо бо ченакҳои маҷмӯии маҷмӯаи додаҳо сарукор дошта бошед. Биёед бубинем, ки чӣ тавр шумо метавонед усулҳои оморӣ барои назорат ва таъмини сифати маълумотро истифода баред.
Як сенарияи тиҷоратро баррасӣ кунед, ки дар он раванди ETL (Extract, Transform, Load) дар як кори ҳаррӯзаи ба нақша гирифташуда N сабт тавлид мекунад. Гурӯҳҳои дастгирӣ метавонанд мехоҳанд, ки санҷишҳои QA-ро барои баланд бардоштани ҳушдор таъсис диҳанд, агар дар шумориши сабт инҳирофоти назаррас вуҷуд дошта бошад. Масалан, агар ин раванд одатан дар тӯли ду моҳ ҳар рӯз аз 9,500 то 10,500 сабт тавлид кунад, ҳама гуна афзоиш ё коҳиши назаррас метавонад мушкилотро бо маълумоти асосӣ нишон диҳад.
Мо метавонем як усули оморӣ барои муайян кардани ин ҳадди аққал, ки дар он раванд бояд ба дастаи дастгирӣ ҳушдор диҳад, истифода барем. Дар зер тасвири пайгирии ҳисобҳои сабт дар тӯли ду моҳ оварда шудааст:
Барои таҳлили ин, мо метавонем маълумоти ҳисобҳои сабтро тағир диҳем, то тағироти ҳаррӯзаро мушоҳида кунем. Ин таѓйиротњо одатан дар атрофи сифр таѓйир меёбанд, тавре ки дар диаграммаи зерин нишон дода шудааст:
Вақте ки мо ин суръати тағирро бо тақсимоти муқаррарӣ муаррифӣ мекунем, он каҷи зангро ташкил медиҳад, ки нишон медиҳад, ки маълумот ба таври муқаррарӣ тақсим карда мешавад. Тағйироти пешбинишуда тақрибан 0% бо инҳирофи стандартии 2,63% аст.
Ин таҳлил нишон медиҳад, ки ҳисоби сабт одатан дар доираи -5,26% то +5,25% бо эътимоди 90% рост меояд. Дар асоси ин, шумо метавонед қоидаеро барои баланд бардоштани ҳушдор муқаррар кунед, агар шумори сабтҳо аз ин диапазон дур шаванд ва дахолати саривақтиро таъмин кунед.
фарогирии аттрибутӣ e ба таносуби арзишҳои ғайри NULL ба миқдори умумии сабти тасвири маҷмӯи додаҳо дахл дорад. Масалан, агар аз 100 сабт 8 адад барои як аттрибутӣ арзиши NULL дошта бошад, фарогирии ин атрибут 92% аст.
Биёед як парвандаи тиҷоратии дигарро бо раванди ETL, ки ҳар рӯз тасвири ҷадвали маҳсулот тавлид мекунад, баррасӣ кунем. Мо мехоҳем фарогирии атрибутҳои тавсифи маҳсулотро назорат кунем. Агар фарогирӣ аз ҳадди муайян поёнтар афтад, бояд барои дастаи дастгирӣ огоҳӣ дода шавад. Дар зер тасвири визуалии фарогирии атрибутҳо барои тавсифи маҳсулот дар тӯли ду моҳ оварда шудааст:
Бо таҳлили фарқиятҳои мутлақи ҳаррӯзаи фарогирӣ, мо мушоҳида мекунем, ки тағиротҳо тақрибан сифр мешаванд:
Муаррифии ин маълумот ҳамчун тақсимоти муқаррарӣ нишон медиҳад, ки он одатан бо тағирёбии интизории тақрибан 0% ва инҳирофи стандартии 2,45% тақсим карда мешавад.
Тавре ки мо мебинем, барои ин маҷмӯаи маълумот, фарогирии атрибутҳои тавсифи маҳсулот одатан аз -4,9% то +4,9% бо 90% эътимодро ташкил медиҳад. Дар асоси ин нишондиҳанда, мо метавонем қоидаеро муқаррар кунем, ки агар фарогирӣ аз ин диапазон дур шавад, ҳушдор медиҳад.
Агар шумо бо маҷмӯаҳои додаҳо кор кунед, ки аз сабаби омилҳои мавсимӣ ё тамоюл фарқиятҳои назаррасро нишон медиҳанд, усулҳои анъанавии оморӣ метавонанд огоҳиҳои бардурӯғро ба вуҷуд оранд. Алгоритмҳои силсилаи вақтҳо равиши дақиқтареро пешниҳод мекунанд, ки дақиқӣ ва эътимоднокии санҷишҳои QA-и шуморо беҳтар мекунанд.
Барои тавлиди огоҳиҳои оқилонатар, шумо метавонед якеро истифода баред
Биёед фурӯши ҳаррӯзаро масхара кунем, ки бо истифода аз 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)
Бо истифода аз ин усул, шумо метавонед инҳирофҳои ҷиддиеро, ки метавонанд мушкилоти сифати маълумотро нишон диҳанд, ошкор созед ва муносибати нисбатан нозукиро ба санҷишҳои QA таъмин кунед.
Умедворам, ки ин мақола ба шумо дар татбиқи самараноки санҷишҳои QA барои маҷмӯи додаҳои бузурги шумо кӯмак мекунад. Бо истифода аз китобхонаи Deequ ва ҳамгироии усулҳои оморӣ ва алгоритмҳои силсилаи вақт, шумо метавонед якпорчагӣ ва эътимоднокии додаҳоро таъмин намуда, дар ниҳоят таҷрибаҳои идоракунии додаҳои худро такмил диҳед.
Татбиқи усулҳои дар боло тавсифшуда ба шумо кӯмак мекунад, ки мушкилоти эҳтимолӣ дар барномаҳои поёнобро пешгирӣ кунед ва сифати умумии ҷараёни кории маълумотро беҳтар кунед.