Կատարված տվյալների մասնագետի կենսական հմտություններից մեկը տվյալների մեծ հավաքածուների արդյունավետ մշակումն է` ապահովելով տվյալների որակը և հուսալիությունը: Տվյալները ցանկացած տվյալների համակարգի կենտրոնական և հիմնարար մասն են, և ինչպիսի լավ հմտություններ էլ ունեք մեր առևտրի այլ ասպեկտներում, սա այն է, որը դուք չեք կարող թույլ տալ անտեսել:
Այս հոդվածում ես ուսումնասիրում եմ Deequ գրադարանի և վիճակագրական մեթոդների կիրառմամբ մեծ տվյալների շտեմարանների վրա QA ստուգումներ կատարելու ամուր մեթոդներ: Համատեղելով այն մոտեցումները, որոնք ես բացատրում եմ ստորև, դուք կկարողանաք պահպանել տվյալների ամբողջականությունը, բարելավել ձեր տվյալների կառավարման գործելակերպը և կանխել ներքևում գտնվող հավելվածներում հնարավոր խնդիրները:
Տվյալների մասշտաբով որակի ապահովումը դժվար գործ է, հատկապես երբ գործ ունենք բաշխված ֆայլային համակարգերում կամ տվյալների պահեստներում պահվող միլիարդավոր տողերի հետ: 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-ը, երբեք զրոյական չեն:
Հատկանիշի եզակիություն. Համոզվեք, որ որոշ ատրիբուտներ, ինչպիսիք են id-ը, եզակի են:
Արժեքների միջակայք. հաստատեք, որ այնպիսի ատրիբուտներ, ինչպիսիք են priority-ը և 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!
Թեստը պարզեց, որ մեր ենթադրությունները խախտվել են։ productName հատկանիշի 5 արժեքներից միայն 4-ը (80%) են ոչ զրոյական, և նկարագրության հատկանիշի 5 արժեքներից միայն 2-ը (այսինքն՝ 40%) պարունակում են URL: Բարեբախտաբար, մենք փորձարկեցինք և գտանք սխալները. ինչ-որ մեկը պետք է անմիջապես շտկի տվյալները:
Թեև Deequ-ն առաջարկում է տվյալների վավերացման ամուր շրջանակ, վիճակագրական մեթոդների ինտեգրումը կարող է ավելի ուժեղացնել ձեր QA ստուգումները, հատկապես, եթե գործ ունեք տվյալների բազայի համախառն չափումների հետ: Տեսնենք, թե ինչպես կարող եք կիրառել վիճակագրական մեթոդներ տվյալների որակը վերահսկելու և ապահովելու համար:
Դիտարկենք բիզնես սցենար, որտեղ ETL (Արտահանում, փոխակերպում, բեռնում) գործընթացը արտադրում է N գրառումներ ամենօրյա պլանավորված աշխատանքի վերաբերյալ: Աջակցող թիմերը կարող են ցանկանալ կարգավորել ՈԱ ստուգումներ՝ ահազանգելու համար, եթե գրառումների քանակում զգալի շեղում կա: Օրինակ, եթե գործընթացը սովորաբար առաջացնում է օրական 9500-ից մինչև 10500 գրառում երկու ամսվա ընթացքում, ցանկացած զգալի աճ կամ նվազում կարող է ցույց տալ հիմքում ընկած տվյալների հետ կապված խնդիր:
Մենք կարող ենք օգտագործել վիճակագրական մեթոդ՝ այս շեմը սահմանելու համար, թե որ գործընթացը պետք է ահազանգ բարձրացնի աջակցող թիմին: Ստորև ներկայացված է երկու ամսվա ընթացքում ռեկորդային թվի հետևման նկարազարդումը.
Սա վերլուծելու համար մենք կարող ենք փոխակերպել ռեկորդների քանակի տվյալները՝ դիտարկելու ամենօրյա փոփոխությունները: Այս փոփոխությունները հիմնականում տատանվում են զրոյի շուրջ, ինչպես ցույց է տրված հետևյալ գծապատկերում.
Երբ մենք ներկայացնում ենք փոփոխության այս տեմպը նորմալ բաշխմամբ, այն ձևավորում է զանգի կոր, որը ցույց է տալիս, որ տվյալները նորմալ բաշխված են: Ակնկալվող փոփոխությունը կազմում է շուրջ 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)
Օգտագործելով այս մեթոդը, դուք կարող եք հայտնաբերել զգալի շեղումներ, որոնք կարող են ցույց տալ տվյալների որակի հետ կապված խնդիրներ՝ ապահովելով ավելի նրբերանգ մոտեցում ՈԱ ստուգումների նկատմամբ:
Հուսով եմ, որ այս հոդվածը կօգնի ձեզ արդյունավետ կերպով իրականացնել ՈԱ ստուգումներ ձեր մեծ տվյալների հավաքածուների համար: Օգտագործելով Deequ գրադարանը և ինտեգրելով վիճակագրական մեթոդները և ժամանակային շարքերի ալգորիթմները, դուք կարող եք ապահովել տվյալների ամբողջականությունն ու հուսալիությունը՝ ի վերջո բարելավելով ձեր տվյալների կառավարման պրակտիկան:
Վերևում նկարագրված տեխնիկայի ներդրումը կօգնի ձեզ կանխել ներքևում գտնվող հավելվածներում հնարավոր խնդիրները և բարելավել ձեր տվյալների աշխատանքային հոսքերի ընդհանուր որակը: