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

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

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

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

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

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

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

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

מחבר Snowflake של שירות העברת הנתונים ל-BigQuery משתמש במנוע התרגום של שירות ההעברה של 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/v2alpha/projects/project_id/locations/location/workflows
    
    • אפשר לבדוק את הסטטוס של הפקודה הזו בדף תרגום ה-SQL ב-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 כדי לזהות עמודה אחת בלבד כמפתח הראשי, או במקרה של מפתח מורכב, משתמשים באותו סוג שימוש בכמה עמודות כדי לזהות את הישויות הייחודיות של טבלה. העמודות האלה פועלות יחד עם COMMIT_TIMESTAMP כדי לחלץ שורות שנוצרו או עודכנו מאז ההרצה האחרונה של ההעברה.

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

{
  "databases": [
    {
      "name": "my_db",
      "originalName": "my_db",
      "tables": [
        {
          "name": "orders",
          "originalName": "orders",
          "columns": [
            {
              "name": "ORDERKEY",
              "originalName": "O_ORDERKEY",
              "type": "INT64",
              "originalType": "NUMERIC",
              "usageType": [
                "PRIMARY_KEY"
              ],
              "isRequired": true,
              "originalColumnLength": 4
            },
            {
              "name": "O_ORDERSTATUS",
              "originalName": "O_ORDERSTATUS",
              "type": "STRING",
              "originalType": "VARCHAR",
              "usageType": [
                "DEFAULT"
              ],
              "isRequired": true,
              "originalColumnLength": 1
            }
          ]
        }
      ]
    }
  ]
}