שימוש באיכות נתונים אוטומטית

במאמר הזה מוסבר איך להשתמש בסריקות של איכות הנתונים ב-Knowledge Catalog (לשעבר Dataplex Universal Catalog) כדי למדוד, לעקוב ולנהל את איכות הנתונים. סריקות של איכות הנתונים עוזרות לאמת את הנתונים באופן אוטומטי כדי לוודא שהם מלאים, תקפים ועקביים.

באמצעות סריקות של איכות הנתונים, אתם יכולים להגדיר כללים לבדיקת ערכים חסרים, לוודא שהערכים תואמים לביטוי רגולרי או שייכים לקבוצה, לוודא שהערכים ייחודיים או להשתמש ב-SQL מותאם אישית כדי לבצע אימותים מורכבים יותר, כמו זיהוי אנומליות. במאמר הזה מוסבר איך ליצור ולנהל סריקות של איכות הנתונים.

מידע נוסף על סריקות של איכות הנתונים מידע נוסף על שימוש חוזר בכללי איכות נתונים בסריקות מרובות

לפני שמתחילים

  1. מפעילים את Dataplex API.

    תפקידים שנדרשים להפעלת ממשקי API

    כדי להפעיל ממשקי API, נדרשת ההרשאה serviceusage.services.enable. אם יצרתם את הפרויקט, סביר להניח שכבר יש לכם את ההרשאה הזו דרך התפקיד 'בעלים' (roles/owner). אחרת, תוכלו לקבל את ההרשאה הזו דרך התפקיד 'אדמין בממשק 'שימוש בשירות'' (roles/serviceusage.serviceUsageAdmin). איך מקצים תפקידים

    להפעלת ה-API

  2. אופציונלי: כדי ליצור המלצות לכללי איכות נתונים על סמך התוצאות של סריקת פרופיל נתונים, יוצרים ומריצים את סריקת פרופיל הנתונים.

תפקידים והרשאות נדרשים

בקטע הזה מתוארים התפקידים וההרשאות של IAM שנדרשים כדי להשתמש בסריקות של איכות הנתונים ב-Knowledge Catalog.

תפקידים והרשאות של משתמשים

כדי לקבל את ההרשאות שדרושות להרצה ולניהול של סריקות איכות נתונים, צריך לבקש מהאדמין להקצות לכם את תפקידי ה-IAM הבאים:

  • מריצים סריקה של איכות הנתונים בטבלה ב-BigQuery:
    • BigQuery Job User (roles/bigquery.jobUser) בפרויקט כדי להריץ משימות סריקה
    • BigQuery Data Viewer (צפייה בנתוני BigQuery) ‏(roles/bigquery.dataViewer) בטבלת BigQuery שרוצים לסרוק
  • פרסום תוצאות של סריקת איכות נתונים ב-Knowledge Catalog:
  • ביצוע משימות ספציפיות במשאבים של DataScan:

להסבר על מתן תפקידים, ראו איך מנהלים את הגישה ברמת הפרויקט, התיקייה והארגון.

התפקידים המוגדרים מראש האלה כוללים את ההרשאות שנדרשות להרצה ולניהול של סריקות איכות נתונים. כדי לראות בדיוק אילו הרשאות נדרשות, אפשר להרחיב את הקטע ההרשאות הנדרשות:

ההרשאות הנדרשות

כדי להריץ סריקות של איכות הנתונים ולנהל אותן, נדרשות ההרשאות הבאות:

  • מריצים סריקה של איכות הנתונים בטבלת BigQuery:
    • bigquery.jobs.create בפרויקט כדי להריץ משימות סריקה
    • bigquery.tables.get בטבלה ב-BigQuery שרוצים לסרוק
    • bigquery.tables.getData בטבלה ב-BigQuery שרוצים לסרוק
  • פרסום תוצאות של סריקת איכות נתונים ב-Knowledge Catalog:
    • bigquery.tables.update בטבלה שנסרקה
    • dataplex.entryGroups.useDataQualityScorecardAspect בכרטיסייה @bigquery של קבוצת הערכים באותו מיקום כמו הטבלה
  • יצירת DataScan: dataplex.datascans.create בפרויקט
  • מחיקת DataScan: dataplex.datascans.delete בפרויקט
  • כדי להציג את המטא-נתונים של DataScan: dataplex.datascans.get בפרויקט
  • צפייה בפרטים של DataScan, כולל כללים ותוצאות: dataplex.datascans.getData בפרויקט
  • רשימת DataScan: dataplex.datascans.list בפרויקט
  • להריץ DataScan: dataplex.datascans.run בפרויקט
  • עדכון של DataScan: dataplex.datascans.update בפרויקט
  • קבלת מדיניות IAM או הגדרת מדיניות IAM ב-DataScan:
    • dataplex.datascans.getIamPolicy בפרויקט
    • dataplex.datascans.setIamPolicy בפרויקט

יכול להיות שתקבלו את ההרשאות האלה באמצעות תפקידים בהתאמה אישית או תפקידים מוגדרים מראש אחרים.

אם אתם צריכים לגשת לעמודות שמוגנות על ידי מדיניות גישה ברמת העמודה ב-BigQuery, אתם צריכים גם הרשאות לעמודות האלה.

תפקידים והרשאות של חשבון שירות ב-Knowledge Catalog

אם לא יצרתם סריקות של איכות נתונים או סריקת פרופיל נתונים, או אם אין לכם אגם של Knowledge Catalog בפרויקט הזה, צרו מזהה שירות על ידי הפעלת הפקודה: gcloud beta services identity create --service=dataplex.googleapis.com. הפקודה הזו מחזירה מזהה של שירות קטלוג הידע, אם הוא קיים.

כדי לוודא שלחשבון השירות של Knowledge Catalog בפרויקט שמכיל את הסריקה של איכות הנתונים יש את ההרשאות הנדרשות לקריאת נתונים ממקורות שונים ולייצוא תוצאות, צריך לבקש מהאדמין להקצות את תפקידי ה-IAM הבאים לחשבון השירות של Knowledge Catalog בפרויקט שמכיל את הסריקה של איכות הנתונים:

  • קריאת נתונים מטבלאות BigQuery: ‫BigQuery Data Viewer (roles/bigquery.dataViewer) בטבלאות BigQuery שצריך לסרוק ובכל טבלה אחרת שמפנים אליה בכללים
  • קריאת נתוני טבלה בקטלוג Iceberg REST:‏ BigLake Viewer (roles/biglake.viewer) בטבלאות של קטלוג Iceberg REST שצריך לסרוק ובכל טבלה אחרת שמופיעה בכללים
  • ייצוא תוצאות הסריקה לטבלה ב-BigQuery: BigQuery Data Editor (roles/bigquery.dataEditor) במערך הנתונים ובטבלה של התוצאות
  • סריקת נתונים ב-BigQuery שמסודרים באגם של Knowledge Catalog:
  • סריקה של טבלה חיצונית ב-BigQuery מ-Cloud Storage: Storage Object Viewer (roles/storage.objectViewer) בקטגוריה של Cloud Storage

להסבר על מתן תפקידים, ראו איך מנהלים את הגישה ברמת הפרויקט, התיקייה והארגון.

התפקידים המוגדרים מראש האלה כוללים את ההרשאות שנדרשות לקריאת נתונים ממקורות שונים ולייצוא תוצאות. כדי לראות בדיוק אילו הרשאות נדרשות, אפשר להרחיב את הקטע ההרשאות הנדרשות:

ההרשאות הנדרשות

כדי לקרוא נתונים ממקורות שונים ולייצא תוצאות, נדרשות ההרשאות הבאות:

  • קריאת נתונים מטבלה ב-BigQuery:
    • bigquery.tables.get בטבלאות BigQuery
    • bigquery.tables.getData בטבלאות BigQuery
  • ייצוא תוצאות הסריקה לטבלה ב-BigQuery:
    • bigquery.datasets.get בטבלה ובמערך הנתונים של התוצאות
    • bigquery.tables.create בטבלה ובמערך הנתונים של התוצאות
    • bigquery.tables.get בטבלה ובמערך הנתונים של התוצאות
    • bigquery.tables.getData בטבלה ובמערך הנתונים של התוצאות
    • bigquery.tables.update בטבלה ובמערך הנתונים של התוצאות
    • bigquery.tables.updateData בטבלה ובמערך הנתונים של התוצאות
  • סריקת נתונים ב-BigQuery שמסודרים באגם Knowledge Catalog:
    • dataplex.lakes.list במשאבי Dataplex
    • dataplex.lakes.get במשאבי Dataplex
    • dataplex.zones.list במשאבי Dataplex
    • dataplex.zones.get במשאבי Dataplex
    • dataplex.entities.list במשאבי Dataplex
    • dataplex.entities.get במשאבי Dataplex
    • dataplex.operations.get במשאבי Dataplex
  • סריקה של טבלה חיצונית ב-BigQuery מ-Cloud Storage:
    • storage.buckets.get בקטגוריה של Cloud Storage
    • storage.objects.get בקטגוריה של Cloud Storage

יכול להיות שהאדמין יוכל גם להעניק לחשבון השירות של Knowledge Catalog בפרויקט שמכיל את הסריקה של איכות הנתונים את ההרשאות האלה באמצעות תפקידים בהתאמה אישית או תפקידים מוגדרים מראש אחרים.

אם אתם צריכים לגשת לעמודות שמוגנות על ידי מדיניות גישה ברמת העמודה ב-BigQuery, אתם צריכים להקצות הרשאות לחשבון השירות של Knowledge Catalog לעמודות האלה.

אם בטבלה מופעלות מדיניות גישה ברמת השורה ב-BigQuery, אפשר לסרוק רק את השורות שחשבון השירות של Knowledge Catalog יכול לראות. הערה: הרשאות הגישה של משתמשים פרטיים לא נבדקות במדיניות ברמת השורה.

דרישות רשת

כדי להריץ סריקה, צריך להפעיל את הגישה הפרטית ל-Google בתת-הרשת של ה-VPC שבה משתמשים לסריקה. אם לא מציינים רשת משנה, צריך לוודא שמופעלת גישה פרטית ל-Google ברשת המשנה שמוגדרת כברירת מחדל.

הגדרת כללים לאיכות הנתונים

אפשר להגדיר כללים לאיכות הנתונים באמצעות:

אם אתם משתמשים ב-Google Cloud CLI, אתם יכולים להגדיר את הכללים האלה בקובץ JSON או YAML.

בדוגמאות שבקטעים הבאים מוסבר איך להגדיר מגוון כללים של איכות נתונים. הכללים מאמתים טבלת דוגמה שמכילה נתונים על עסקאות של לקוחות. נניח שהסכימה של הטבלה היא:

שם העמודה סוג העמודה תיאור העמודה
transaction_timestamp חותמת הזמן חותמת הזמן של העסקה. הטבלה מחולקת למחיצות לפי השדה הזה.
customer_id String מספר לקוח בפורמט של 8 אותיות ואחריהן 16 ספרות.
transaction_id String מזהה העסקה צריך להיות ייחודי בכל הטבלה.
currency_id String אחד מהמטבעות הנתמכים. סוג המטבע צריך להיות זהה לאחד מסוגי המטבעות שזמינים בטבלת המימדים dim_currency.
amount מספר ממשי (float) סכום העסקה.
discount_pct מספר ממשי (float) אחוז ההנחה. הערך צריך להיות בין 0 ל-100.

הגדרת כללים לאיכות הנתונים באמצעות סוגי כללים מובנים

הדוגמאות הבאות מבוססות על סוגי כללים מובנים. אפשר ליצור כללים על סמך סוגי כללים מובנים באמצעות Google Cloud המסוף או ה-API. יכול להיות ש-Knowledge Catalog ימליץ על חלק מהכללים האלה.

שם עמודה סוג הכלל המימד המוצע פרמטרים של כללים
transaction_id בדיקת ייחודיות ייחודיות סף: Not Applicable
amount בדיקת ערך Null השלמות סף: 100%
customer_id בדיקת ביטוי רגולרי (regex) תוקף ביטוי רגולרי: ^[a-zA-Z]{8}[0-9]{16}$
ערך סף: 100%
currency_id בדיקת ערך מוגדר תוקף קבוצה של: USD,JPY,INR,GBP,CAN
סף: 100%

הגדרת כללים לאיכות הנתונים באמצעות כללי SQL בהתאמה אישית

כדי ליצור כללי SQL בהתאמה אישית, משתמשים במסגרת הבאה:

  • כשיוצרים כלל שמעריך שורה אחת בכל פעם, צריך ליצור ביטוי שמפיק את מספר השורות שהוערכו בהצלחה כש-Knowledge Catalog מעריך את השאילתה SELECT COUNTIF(CUSTOM_SQL_EXPRESSION) FROM TABLE. ב-Knowledge Catalog נבדק אם מספר השורות שעברו בהצלחה עומד בסף.

  • כשיוצרים כלל שמוערך על פני השורות או שמשתמש בתנאי של טבלה, צריך ליצור ביטוי שמחזיר הצלחה או כישלון כש-Knowledge Catalog מעריך את השאילתה SELECT IF(CUSTOM_SQL_EXPRESSION) FROM TABLE.

  • כשיוצרים כלל שמעריך את המצב הלא תקין של מערך נתונים, צריך לספק הצהרה שמחזירה שורות לא תקינות. אם מוחזרות שורות, הכלל נכשל. משמיטים את הנקודה-פסיק בסוף הצהרת ה-SQL.

  • אפשר להפנות לטבלה של מקור נתונים ולכל מסנני התנאים המוקדמים שלה באמצעות פרמטר ההפניה לנתונים ${data()} בכלל, במקום לציין במפורש את טבלת המקור והמסננים שלה. דוגמאות למסנני תנאי מוקדם כוללות מסנני שורות, אחוזים של דגימה ומסננים מצטברים. הפרמטר ${data()} הוא תלוי אותיות רישיות.

הדוגמאות הבאות מבוססות על כללי SQL בהתאמה אישית.

סוג הכלל תיאור הכלל ביטוי SQL
תנאי השורה הפונקציה בודקת אם הערך של discount_pct הוא בין 0 ל-100. 0 <discount_pct AND discount_pct < 100
תנאי השורה בדיקה של הפניה כדי לוודא ש-currency_id היא אחת מהמטבעות הנתמכים. currency_id in (select id from my_project_id.dim_dataset.dim_currency)
מצב הטבלה ביטוי SQL מצטבר שבודק אם הערך הממוצע של discount_pct הוא בין 30% ל-50%. 30<avg(discount) AND avg(discount) <50
תנאי השורה הפונקציה בודקת אם תאריך מסוים לא חל בעתיד. TIMESTAMP(transaction_timestamp) < CURRENT_TIMESTAMP()
מצב הטבלה פונקציה בהגדרת המשתמש (UDF) ב-BigQuery כדי לבדוק שהסכום הממוצע של העסקאות קטן מערך מוגדר מראש לכל מדינה. כדי ליצור את ה-UDF (ב-JavaScript), מריצים את הפקודה הבאה:
        CREATE OR REPLACE FUNCTION
        myProject.myDataset.average_by_country (
          country STRING, average FLOAT64)
        RETURNS BOOL LANGUAGE js AS R"""
        if (country = "CAN" && average < 5000){
          return 1
        } else if (country = "IND" && average < 1000){
          return 1
        } else { return 0 }
        """;
       
דוגמה לכלל לבדיקת סכום העסקה הממוצע עבור country=CAN.
        myProject.myDataset.average_by_country(
        "CAN",
        (SELECT avg(amount) FROM
          myProject.myDataset.transactions_table
            WHERE currency_id = 'CAN'
        ))
      
מצב הטבלה סעיף BigQuery ML predict לזיהוי אנומליות ב-discount_pct. המערכת בודקת אם צריך להחיל הנחה על סמך customer, currency ו-transaction. הכלל בודק אם התחזית תואמת לערך בפועל ב-99% מהמקרים לפחות. הנחה: מודל למידת המכונה נוצר לפני השימוש בכלל. יוצרים את מודל ה-ML באמצעות הפקודה הבאה:
  CREATE MODEL
  model-project-id.dataset-id.model-name
        OPTIONS(model_type='logistic_reg') AS
  SELECT
  IF(discount_pct IS NULL, 0, 1) AS label,
  IFNULL(customer_id, "") AS customer,
  IFNULL(currency_id, "") AS currency,
  IFNULL(amount, 0.0) AS amount
  FROM
  `data-project-id.dataset-id.table-names`
  WHERE transaction_timestamp < '2022-01-01';
  
הכלל הבא בודק אם דיוק התחזית גדול מ-99%.
      SELECT
        accuracy > 0.99
      FROM
       ML.EVALUATE
        (MODEL model-project-id.dataset-id.model-name,
         (
          SELECT
            customer_id,
            currency_id,
            amount,
            discount_pct
          FROM
            data-project-id.dataset-id.table-names
          WHERE transaction_timestamp > '2022-01-01';
         )
        )
    
תנאי השורה פונקציית חיזוי של BigQuery ML לזיהוי אנומליות ב-discount_pct. הפונקציה בודקת אם צריך להחיל הנחה על סמך customer, currency ו-transaction. הכלל מזהה את כל המקרים שבהם התחזית לא תאמה. הנחה: מודל ה-ML נוצר לפני השימוש בכלל. יוצרים את מודל למידת המכונה באמצעות הפקודה הבאה:
  CREATE MODEL
  model-project-id.dataset-id.model-name
        OPTIONS(model_type='logistic_reg') AS
  SELECT
  IF(discount_pct IS NULL, 0, 1) AS label,
  IFNULL(customer_id, "") AS customer,
  IFNULL(currency_id, "") AS currency,
  IFNULL(amount, 0.0) AS amount
  FROM
  `data-project-id.dataset-id.table-names`
  WHERE transaction_timestamp < '2022-01-01';
  
הכלל הבא בודק אם התחזית לגבי ההנחה תואמת לערך בפועל בכל שורה.
       IF(discount_pct > 0, 1, 0)
          =(SELECT predicted_label FROM
           ML.PREDICT(
            MODEL model-project-id.dataset-id.model-name,
              (
                SELECT
                  customer_id,
                  currency_id,
                  amount,
                  discount_pct
                FROM
                  data-project-id.dataset-id.table-names AS t
                    WHERE t.transaction_timestamp =
                     transaction_timestamp
                   LIMIT 1
              )
            )
         )
    
טענת נכוֹנוּת (assertion) של SQL הפונקציה בודקת אם הערך של discount_pct גדול מ-30% להיום, על ידי בדיקה אם יש שורות עם אחוז הנחה שקטן מ-30 או שווה ל-30. SELECT * FROM my_project_id.dim_dataset.dim_currency WHERE discount_pct <= 30 AND transaction_timestamp >= current_date()
טענת SQL (עם פרמטר הפניה לנתונים)

הפונקציה בודקת אם הערך discount_pct גדול מ-30% עבור כל המטבעות הנתמכים היום.

מסנן התאריכים transaction_timestamp >= current_date() מוחל כמסנן שורות על טבלת מקור הנתונים.

פרמטר ההפניה לנתונים ${data()} משמש כמחזיק מקום ל-my_project_id.dim_dataset.dim_currency WHERE transaction_timestamp >= current_date() ומחיל את מסנן השורות.

SELECT * FROM ${data()} WHERE discount_pct > 30

הגדרת כללים לאיכות הנתונים באמצעות ה-CLI של gcloud

בקובץ ה-YAML לדוגמה הבא נעשה שימוש בחלק מהכללים שמופיעים בכללים לדוגמה באמצעות סוגים מובנים ובכללי SQL בהתאמה אישית לדוגמה. קובץ ה-YAML הזה מכיל גם מפרטים אחרים לסריקה של איכות הנתונים, כמו מסננים ואחוז הדגימה. כשמשתמשים ב-CLI של gcloud כדי ליצור או לעדכן סריקה של איכות הנתונים, אפשר להשתמש בקובץ YAML כקלט לארגומנט --data-quality-spec-file.

rules:
- uniquenessExpectation: {}
  column: transaction_id
  dimension: UNIQUENESS
- nonNullExpectation: {}
  column: amount
  dimension: COMPLETENESS
  threshold: 1
- regexExpectation:
    regex: '^[a-zA-Z]{8}[0-9]{16}$'
  column : customer_id
  ignoreNull : true
  dimension : VALIDITY
  threshold : 1
- setExpectation :
    values :
    - 'USD'
    - 'JPY'
    - 'INR'
    - 'GBP'
    - 'CAN'
  column : currency_id
  ignoreNull : true
  dimension : VALIDITY
  threshold : 1
- rangeExpectation:
    minValue : '0'
    maxValue : '100'
  column : discount_pct
  ignoreNull : true
  dimension : VALIDITY
  threshold : 1
- rowConditionExpectation:
    sqlExpression : 0 < `discount_pct` AND `discount_pct` < 100
  column: discount_pct
  dimension: VALIDITY
  threshold: 1
- rowConditionExpectation:
    sqlExpression : currency_id in (select id from `my_project_id.dim_dataset.dim_currency`)
  column: currency_id
  dimension: VALIDITY
  threshold: 1
- tableConditionExpectation:
    sqlExpression : 30 < avg(discount_pct) AND avg(discount_pct) < 50
  dimension: VALIDITY
- rowConditionExpectation:
    sqlExpression : TIMESTAMP(transaction_timestamp) < CURRENT_TIMESTAMP()
  column: transaction_timestamp
  dimension: VALIDITY
  threshold: 1
- sqlAssertion:
    sqlStatement :