זיהוי ומיפוי סכימות ב-Snowflake

במדריך הזה נסביר איך להגדיר את הסכימה כשמעבירים נתונים מ-Snowflake ל-BigQuery. אתם יכולים להשתמש בשירות העברת הנתונים ל-BigQuery כדי לזהות באופן אוטומטי את הסכימה ואת מיפוי סוגי הנתונים, או להשתמש במנוע התרגום כדי להגדיר את הסכימה ואת סוגי הנתונים באופן ידני.

הפעלת זיהוי אוטומטי של סכימת ברירת המחדל

המחבר של Snowflake יכול לזהות באופן אוטומטי את הסכימה של הטבלה ב-Snowflake. כדי להשתמש בזיהוי סכימה אוטומטי, אפשר להשאיר את השדה Translation output GCS path ריק כשמגדירים העברה מ-Snowflake.

ברשימה הבאה מוסבר איך המחבר של Snowflake ממפה את סוגי הנתונים של Snowflake ל-BigQuery:

  • סוגי הנתונים הבאים ממופים כ-STRING ב-BigQuery:
    • TIMESTAMP_TZ
    • TIMESTAMP_LTZ
    • OBJECT
    • VARIANT
    • ARRAY
  • סוגי הנתונים הבאים ממופים כ-TIMESTAMP ב-BigQuery:
    • TIMESTAMP_NTZ

כל שאר סוגי הנתונים ב-Snowflake ממופים ישירות לסוגים המקבילים שלהם ב-BigQuery.

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

המחבר של שירות העברת הנתונים ל-BigQuery עבור Snowflake משתמש במנוע התרגום של שירות ההעברה ל-BigQuery למיפוי סכימות, כשמעבירים טבלאות של Snowflake ל-BigQuery.

כדי להגדיר את הסכימה באופן ידני (לדוגמה, כדי לשנות מאפיינים מסוימים של הסכימה), אתם יכולים ליצור את המטא-נתונים ואז להפעיל את מנוע התרגום.

מגבלות

  • הנתונים נשלפים מ-Snowflake בפורמט הנתונים Parquet לפני שהם נטענים ל-BigQuery:

    • סוגי הנתונים הבאים של Parquet לא נתמכים:
    • סוגי הנתונים הבאים של Parquet לא נתמכים, אבל אפשר להמיר אותם:

      • TIMESTAMP_NTZ
      • OBJECT, VARIANT, ARRAY

      משתמשים בקובץ YAML של הגדרת המרת סוגים גלובלית כדי לשנות את התנהגות ברירת המחדל של סוגי הנתונים האלה כשמריצים את מנוע התרגום.

      קובץ ה-YAML של ההגדרות עשוי להיראות כמו בדוגמה הבאה:

      type: experimental_object_rewriter
      global:
        typeConvert:
          datetime: TIMESTAMP
          json: VARCHAR
      

ההרשאות הנדרשות לחשבון השירות

בהעברה מ-Snowflake, חשבון שירות משמש לקריאת נתונים מהפלט של מנוע התרגום בנתיב Cloud Storage שצוין. אתם צריכים לתת לחשבון השירות את ההרשאות storage.objects.get ו-storage.objects.list.

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

מידע נוסף זמין במאמר תפקידים והרשאות של IAM ב-BigQuery.

הגדרה ידנית של מיפוי הסכימה

כדי להגדיר באופן ידני את מיפוי הסכימה:

  1. מריצים את dwh-migration-tool ל-Snowflake. מידע נוסף מופיע במאמר יצירת מטא-נתונים לתרגום ולהערכה.
  2. מעלים את קובץ ה-metadata.zip שנוצר לקטגוריה של Cloud Storage. הקובץ metadata.zip משמש כקלט למנוע התרגום.
  3. מריצים את שירות התרגום באצווה, ומציינים את השדה target_types בתור metadata. מידע נוסף זמין במאמר תרגום שאילתות SQL באמצעות Translation API.

    • דוגמה לפקודה להרצת תרגום באצווה ל-Snowflake:
      curl -d "{
      \"name\": \"sf_2_bq_translation\",
      \"displayName\": \"Snowflake to BigQuery Translation\",
      \"tasks\": {
          string: {
            \"type\": \"Snowflake2BigQuery_Translation\",
            \"translation_details\": {
                \"target_base_uri\": \"gs://sf_test_translation/output\",
                \"source_target_mapping\": {
                  \"source_spec\": {
                      \"base_uri\": \"gs://sf_test_translation/input\"
                  }
                },
                \"target_types\": \"metadata\",
            }
          }
      },
      }" \
      -H "Content-Type:application/json" \
      -H "Authorization: Bearer TOKEN" -X POST https://bigquerymigration.googleapis.com/v2/projects/project_id/locations/location/workflows
    
    • אפשר לבדוק את הסטטוס של הפקודה הזו בדף SQL Translation ב-BigQuery. הפלט של משימת התרגום באצווה מאוחסן ב-gs://translation_target_base_uri/metadata/config/.

קובץ סכימה בהתאמה אישית

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

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

קובץ סכימה בהתאמה אישית הוא קובץ JSON שמתאר אובייקטים של מסד נתונים. הסכימה מכילה קבוצה של מסדי נתונים, שכל אחד מהם מכיל קבוצה של טבלאות, שכל אחת מהן מכילה קבוצה של עמודות. לכל אובייקט יש שדה originalName שמציין את שם האובייקט ב-Snowflake, ושדה name שמציין את שם היעד של האובייקט ב-BigQuery.

העמודות מכילות את השדות הבאים:

  • ‫originalType: מציין את סוג הנתונים בעמודה ב-Snowflake
  • ‫type: מציין את סוג נתוני היעד של העמודה ב-BigQuery.
  • ‫usageType: מידע על האופן שבו המערכת משתמשת בעמודה. אלה סוגי השימוש שנתמכים:

    • ‫DEFAULT: אפשר להוסיף הערות לכמה עמודות בטבלת יעד אחת עם סוג השימוש הזה. סוג השימוש DEFAULT מציין שלעמודה אין שימוש מיוחד במערכת המקור. זה ערך ברירת המחדל.
    • ‫PRIMARY_KEY: אפשר להוסיף הערות לעמודות בכל טבלת יעד עם סוג השימוש הזה. כדי לזהות עמודה אחת כמפתח הראשי, משתמשים בסוג השימוש PRIMARY_KEY. כדי לזהות את הישויות הייחודיות של טבלה, משתמשים באותו סוג שימוש בכמה עמודות. העמודות האלה פועלות יחד עם מעקב השינויים של Snowflake (CHANGE_TRACKING = TRUE בטבלה) כדי לחלץ שורות שנוצרו או עודכנו מאז הרצת ההעברה האחרונה. בלי עמודת PRIMARY_KEY, שירות העברת הנתונים ל-BigQuery מריץ העברות מצטברות במצב הוספה בלבד, ועדכונים ומחיקות לא מיושמים.

בדוגמה הבאה מוצג קובץ סכימה בהתאמה אישית להעברת טבלה ב-Snowflake שנקראת orders במסד הנתונים my_db, לשינוי השם של העמודה O_ORDERKEY ל-order_id ולזיהוי O_ORDERKEY כמפתח הראשי:

    {
      "databases": [
        {
          "name": "my_db",
          "originalName": "my_db",
          "tables": [
            {
              "name": "orders",
              "originalName": "orders",
              "columns": [
                {
                  "name": "order_id",
                  "originalName": "O_ORDERKEY",
                  "type": "INT64",
                  "originalType": "NUMBER",
                  "usageType": [
                    "PRIMARY_KEY"
                  ],
                  "isRequired": true
                },
                {
                  "name": "order_date",
                  "originalName": "O_ORDERDATE",
                  "type": "DATE",
                  "originalType": "DATE",
                  "usageType": [
                    "DEFAULT"
                  ]
                },
                {
                  "name": "order_status",
                  "originalName": "O_ORDERSTATUS",
                  "type": "STRING",
                  "originalType": "VARCHAR",
                  "usageType": [
                    "DEFAULT"
                  ]
                }
              ]
            }
          ]
        }
      ]
    }