Data Engineering Manager at Innovate UK
ជំនាញសំខាន់មួយនៃជំនាញទិន្នន័យដែលសម្រេចបានគឺការគ្រប់គ្រងប្រកបដោយប្រសិទ្ធភាពនៃសំណុំទិន្នន័យធំ ដោយធានាបាននូវគុណភាពទិន្នន័យ និងភាពជឿជាក់។ ទិន្នន័យគឺជាផ្នែកកណ្តាល និងជាមូលដ្ឋាននៃប្រព័ន្ធទិន្នន័យណាមួយ ហើយអ្វីក៏ដោយដែលអ្នកមានជំនាញល្អនៅក្នុងទិដ្ឋភាពផ្សេងទៀតនៃពាណិជ្ជកម្មរបស់យើង នេះគឺជាអ្វីដែលអ្នកមិនអាចមើលរំលងបាន។
នៅក្នុងអត្ថបទនេះ ខ្ញុំស្វែងយល់ពីបច្ចេកទេសដ៏រឹងមាំសម្រាប់អនុវត្តការត្រួតពិនិត្យ 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 និងឈ្មោះផលិតផលមិន NULL ទេ។
ភាពប្លែកនៃគុណលក្ខណៈ៖ ត្រូវប្រាកដថាលក្ខណៈជាក់លាក់ ដូចជាលេខសម្គាល់មានលក្ខណៈប្លែកពីគេ។
ជួរតម្លៃ៖ ធ្វើឱ្យមានសុពលភាពថាគុណលក្ខណៈដូចជាអាទិភាព និង numViews ធ្លាក់ក្នុងជួរដែលរំពឹងទុក។
ការផ្គូផ្គងលំនាំ៖ ផ្ទៀងផ្ទាត់ថាការពិពណ៌នាមាន URLs នៅពេលរំពឹងទុក។
លក្ខណៈសម្បត្តិស្ថិតិ៖ ធានាថាមធ្យមនៃគុណលក្ខណៈលេខត្រូវនឹងលក្ខណៈវិនិច្ឆ័យជាក់លាក់។
នេះជារបៀបដែលអ្នកអាចអនុវត្តការត្រួតពិនិត្យទាំងនេះដោយប្រើ 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 សម្រាប់ការត្រួតពិនិត្យទំហំ) នៅលើម៉ែត្រទាំងនេះ ដើម្បីមើលថាតើការរឹតត្បិតលើទិន្នន័យឬអត់។ យើងអាចពិនិត្យមើលវត្ថុ "លទ្ធផលផ្ទៀងផ្ទាត់" ដើម្បីមើលថាតើការធ្វើតេស្តរកឃើញកំហុសដែរឬទេ៖
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%) នៃតម្លៃនៃគុណលក្ខណៈឈ្មោះផលិតផលគឺមិនមែនជាមោឃៈ ហើយមានតែ 2 ក្នុងចំណោម 5 (ពោលគឺ 40%) នៃគុណលក្ខណៈពិពណ៌នាដែលមាន URL ។ ជាសំណាងល្អ យើងបានដំណើរការការសាកល្បង ហើយបានរកឃើញកំហុស។ នរណាម្នាក់គួរតែជួសជុលទិន្នន័យភ្លាមៗ!
ខណៈពេលដែល Deequ ផ្តល់នូវក្របខ័ណ្ឌដ៏រឹងមាំមួយសម្រាប់សុពលភាពទិន្នន័យ ការរួមបញ្ចូលវិធីសាស្រ្តស្ថិតិអាចបង្កើនការត្រួតពិនិត្យ QA របស់អ្នកបន្ថែមទៀត ជាពិសេសប្រសិនបើអ្នកកំពុងដោះស្រាយជាមួយនឹងម៉ែត្រសរុបនៃសំណុំទិន្នន័យ។ តោះមើលពីរបៀបដែលអ្នកអាចប្រើប្រាស់វិធីសាស្រ្តស្ថិតិដើម្បីតាមដាន និងធានាគុណភាពទិន្នន័យ។
ពិចារណាលើសេណារីយ៉ូអាជីវកម្មដែលដំណើរការ ETL (Extract, Transform, Load) បង្កើតកំណត់ត្រា N នៅលើការងារដែលបានកំណត់ពេលប្រចាំថ្ងៃ។ ក្រុមគាំទ្រប្រហែលជាចង់រៀបចំការត្រួតពិនិត្យ QA ដើម្បីបង្កើនការដាស់តឿន ប្រសិនបើមានគម្លាតគួរឱ្យកត់សម្គាល់នៅក្នុងចំនួនកំណត់ត្រា។ ជាឧទាហរណ៍ ប្រសិនបើដំណើរការនេះជាធម្មតាបង្កើតកំណត់ត្រាចន្លោះពី 9,500 ទៅ 10,500 ជារៀងរាល់ថ្ងៃក្នុងរយៈពេលពីរខែ ការកើនឡើង ឬថយចុះគួរឱ្យកត់សម្គាល់ណាមួយអាចបង្ហាញពីបញ្ហាជាមួយនឹងទិន្នន័យមូលដ្ឋាន។
យើងអាចប្រើវិធីស្ថិតិដើម្បីកំណត់កម្រិតនេះលើដំណើរការមួយណាដែលគួរបង្កើនការជូនដំណឹងដល់ក្រុមគាំទ្រ។ ខាងក្រោមនេះគឺជាការបង្ហាញពីការតាមដានចំនួនកំណត់ក្នុងរយៈពេលពីរខែ៖
ដើម្បីវិភាគនេះ យើងអាចបំប្លែងទិន្នន័យរាប់កំណត់ត្រា ដើម្បីសង្កេតមើលការផ្លាស់ប្តូរពីមួយថ្ងៃទៅមួយថ្ងៃ។ ការផ្លាស់ប្តូរទាំងនេះជាទូទៅវិលជុំវិញសូន្យ ដូចដែលបានបង្ហាញក្នុងតារាងខាងក្រោម៖
នៅពេលដែលយើងតំណាងឱ្យអត្រានៃការផ្លាស់ប្តូរនេះជាមួយនឹងការចែកចាយធម្មតា វាបង្កើតជាខ្សែកោងកណ្ដឹង ដែលបង្ហាញថាទិន្នន័យត្រូវបានចែកចាយជាធម្មតា។ ការផ្លាស់ប្តូរដែលរំពឹងទុកគឺប្រហែល 0% ជាមួយនឹងគម្លាតស្តង់ដារ 2.63% ។
ការវិភាគនេះបង្ហាញថាការរាប់កំណត់ត្រាជាធម្មតាធ្លាក់ក្នុងចន្លោះពី -5.26% ទៅ +5.25% ជាមួយនឹងទំនុកចិត្ត 90%។ ដោយផ្អែកលើចំណុចនេះ អ្នកអាចបង្កើតច្បាប់មួយដើម្បីបង្កើនការដាស់តឿន ប្រសិនបើចំនួនកំណត់ត្រានេះខុសពីជួរនេះ ដោយធានាបាននូវអន្តរាគមន៍ទាន់ពេលវេលា។
Attribute coverag e សំដៅទៅលើសមាមាត្រនៃតម្លៃដែលមិនមែនជា NULL ទៅនឹងចំនួនកំណត់ត្រាសរុបសម្រាប់រូបថតសំណុំទិន្នន័យ។ ឧទាហរណ៍ ប្រសិនបើកំណត់ត្រា 8 ក្នុងចំណោម 100 មានតម្លៃ 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 និងការរួមបញ្ចូលវិធីសាស្រ្តស្ថិតិ និងក្បួនដោះស្រាយស៊េរីពេលវេលា អ្នកអាចធានាបាននូវភាពត្រឹមត្រូវនៃទិន្នន័យ និងភាពអាចជឿជាក់បាន ទីបំផុតបង្កើនការអនុវត្តការគ្រប់គ្រងទិន្នន័យរបស់អ្នក។
ការអនុវត្តបច្ចេកទេសដែលបានពិពណ៌នាខាងលើនឹងជួយអ្នកការពារបញ្ហាដែលអាចកើតមាននៅក្នុងកម្មវិធីខាងក្រោម និងកែលម្អគុណភាពទាំងមូលនៃលំហូរការងារទិន្នន័យរបស់អ្នក។