זיהוי ומיפוי סכימות ב-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. במקרה של מפתח מורכב, משתמשים באותו סוג שימוש בכמה עמודות כדי לזהות את הישויות הייחודיות של הטבלה. העמודות האלה פועלות יחד עם COMMIT_TIMESTAMP כדי לחלץ שורות שנוצרו או עודכנו מאז הפעלת ההעברה האחרונה.

בדוגמה הבאה מוצג קובץ סכימה בהתאמה אישית להעברת טבלה של Snowflake בשם orders במסד הנתונים 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
            }
          ]
        }
      ]
    }
  ]
}