תבנית Cloud Storage Text to BigQuery עם פונקציית UDF ב-Python

הצינור "טקסט מ-Cloud Storage ל-BigQuery באמצעות פונקציה בהגדרת המשתמש (UDF) ב-Python" הוא צינור עיבוד נתונים באצווה שקורא קובצי טקסט שמאוחסנים ב-Cloud Storage, משנה אותם באמצעות פונקציה בהגדרת המשתמש (UDF) ב-Python ומוסיף את התוצאה לטבלה ב-BigQuery.

דרישות לגבי צינור עיבוד הנתונים

  • יוצרים קובץ JSON שמתאר את הסכימה של BigQuery.

    צריך לוודא שיש מערך JSON ברמה העליונה בשם BigQuery Schema ושהתוכן שלו תואם לתבנית {"name": "COLUMN_NAME", "type": "DATA_TYPE"}.

    תבנית האצווה Cloud Storage Text to BigQuery לא תומכת בייבוא נתונים לשדות STRUCT (רשומה) בטבלת היעד ב-BigQuery.

    הקוד הבא ב-JSON מתאר סכימה לדוגמה של BigQuery:

    {
      "BigQuery Schema": [
        {
          "name": "name",
          "type": "STRING"
        },
        {
          "name": "age",
          "type": "INTEGER"
        },
      ]
    }
  • יוצרים קובץ Python (.py) עם פונקציית ה-UDF שמספקת את הלוגיקה לשינוי שורות הטקסט. הפונקציה חייבת להחזיר מחרוזת JSON.

    לדוגמה, הפונקציה הזו מפצלת כל שורה בקובץ CSV ומחזירה מחרוזת JSON אחרי שהיא משנה את הערכים.

    import json
    def process(value):
      data = value.split(',')
      obj = { 'name': data[0], 'age': int(data[1]) }
      return json.dumps(obj)

פרמטרים של תבניות

פרמטר תיאור
JSONPath הנתיב gs:// לקובץ ה-JSON שמגדיר את הסכימה של BigQuery, שמאוחסן ב-Cloud Storage. לדוגמה, gs://path/to/my/schema.json.
pythonExternalTextTransformGcsPath ה-URI של Cloud Storage של קובץ הקוד ב-Python שמגדיר את הפונקציה בהגדרת המשתמש (UDF) שבה רוצים להשתמש. לדוגמה, gs://my-bucket/my-udfs/my_file.py.
pythonExternalTextTransformFunctionName השם של הפונקציה בהגדרת המשתמש (UDF) ב-Python שבה רוצים להשתמש.
inputFilePattern הנתיב של gs:// לטקסט ב-Cloud Storage שרוצים לעבד. לדוגמה, gs://path/to/my/text/data.txt.
outputTable השם של הטבלה ב-BigQuery שרוצים ליצור כדי לאחסן בה את הנתונים המעובדים. אם אתם משתמשים שוב בטבלה קיימת ב-BigQuery, הנתונים יתווספו לטבלת היעד. לדוגמה, my-project-name:my-dataset.my-table.
bigQueryLoadingTemporaryDirectory הספרייה הזמנית לתהליך הטעינה של BigQuery. לדוגמה, gs://my-bucket/my-files/temp_dir.
useStorageWriteApi אופציונלי: אם true, צינור עיבוד הנתונים משתמש ב-BigQuery Storage Write API (gRPC). ערך ברירת המחדל הוא false. מידע נוסף מופיע במאמר שימוש ב-Storage Write API ‏(gRPC).
useStorageWriteApiAtLeastOnce אופציונלי: כשמשתמשים ב-Storage Write API ‏(gRPC), מציינים את הסמנטיקה של הכתיבה. כדי להשתמש בסמנטיקה של לפחות פעם אחת, צריך להגדיר את הפרמטר הזה לערך true. כדי להשתמש בסמנטיקה של פעם אחת בדיוק, מגדירים את הפרמטר לערך false. הפרמטר הזה רלוונטי רק כש-useStorageWriteApi הוא true. ערך ברירת המחדל הוא false.

פונקציה בהגדרת המשתמש (UDF)

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

מפרט הפונקציה

המפרט של ה-UDF הוא:

  • קלט: שורת טקסט מקובץ קלט ב-Cloud Storage.
  • פלט: מחרוזת JSON שתואמת לסכימה של טבלת היעד ב-BigQuery.

הפעלת התבנית

המסוף

  1. נכנסים לדף Create job from template ב-Dataflow.
  2. כניסה לדף Create job from template
  3. בשדה Job name, מזינים שם ייחודי למשימה.
  4. אופציונלי: בשדה Regional endpoint, בוחרים ערך מהתפריט הנפתח. אזור ברירת המחדל הוא us-central1.

    רשימה של אזורים שבהם אפשר להריץ משימת Dataflow מופיעה במאמר מיקומי Dataflow.

  5. בתפריט הנפתח Dataflow template, בוחרים את התבנית Text Files on Cloud Storage to BigQuery with Python UDF (Batch).
  6. בשדות הפרמטרים שמופיעים, מזינים את ערכי הפרמטרים.
  7. לוחצים על Run job.

gcloud

במעטפת או בטרמינל, מריצים את התבנית:

gcloud dataflow flex-template run JOB_NAME \
    --template-file-gcs-location gs://dataflow-templates/VERSION/flex/GCS_Text_to_BigQuery_Xlang \
    --region REGION_NAME \
    --parameters \
pythonExternalTextTransformFunctionName=PYTHON_FUNCTION,\
JSONPath=PATH_TO_BIGQUERY_SCHEMA_JSON,\
pythonExternalTextTransformGcsPath=PATH_TO_PYTHON_UDF_FILE,\
inputFilePattern=PATH_TO_TEXT_DATA,\
outputTable=BIGQUERY_TABLE,\
bigQueryLoadingTemporaryDirectory=PATH_TO_TEMP_DIR_ON_GCS

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

  • ‫PROJECT_ID: Google Cloud מזהה הפרויקט שבו רוצים להריץ את משימת Dataflow
  • ‫JOB_NAME: שם ייחודי למשימה, לפי בחירתכם
  • ‫VERSION: גרסת התבנית שבה רוצים להשתמש

    אפשר להשתמש בערכים הבאים:

    • latest כדי להשתמש בגרסה העדכנית של התבנית, שזמינה בתיקיית ההורה ללא תאריך בקטגוריה – gs://dataflow-templates/latest/
    • שם הגרסה, כמו 2023-09-12-00_RC00, כדי להשתמש בגרסה ספציפית של התבנית, שנמצאת בתיקיית הנתונים מתאריך ספציפי בקטגוריה – gs://dataflow-templates/
  • ‫REGION_NAME: האזור שבו רוצים לפרוס את משימת Dataflow, לדוגמה us-central1
  • ‫PYTHON_FUNCTION: השם של הפונקציה בהגדרת המשתמש (UDF) ב-Python שבה רוצים להשתמש.
  • ‫PATH_TO_BIGQUERY_SCHEMA_JSON: הנתיב ב-Cloud Storage לקובץ ה-JSON שמכיל את הגדרת הסכימה
  • ‫PATH_TO_PYTHON_UDF_FILE: ה-URI של Cloud Storage של קובץ הקוד ב-Python שמגדיר את הפונקציה בהגדרת המשתמש (UDF) שבה רוצים להשתמש. לדוגמה, gs://my-bucket/my-udfs/my_file.py.
  • ‫PATH_TO_TEXT_DATA: הנתיב ב-Cloud Storage למערך הנתונים של הטקסט
  • ‫BIGQUERY_TABLE: שם הטבלה ב-BigQuery
  • ‫PATH_TO_TEMP_DIR_ON_GCS: הנתיב ב-Cloud Storage לספרייה הזמנית

API

כדי להריץ את התבנית באמצעות ה-API ל-REST, שולחים בקשת HTTP POST. למידע נוסף על ה-API ועל היקפי ההרשאות שלו, קראו את המאמר projects.templates.launch.

POST https://dataflow.googleapis.com/v1b3/projects/PROJECT_ID/locations/LOCATION/flexTemplates:launch
{
   "launch_parameter": {
      "jobName": "JOB_NAME",
      "parameters": {
        "pythonExternalTextTransformFunctionName": "PYTHON_FUNCTION",
        "JSONPath": "PATH_TO_BIGQUERY_SCHEMA_JSON",
        "pythonExternalTextTransformGcsPath": "PATH_TO_PYTHON_UDF_FILE",
        "inputFilePattern":"PATH_TO_TEXT_DATA",
        "outputTable":"BIGQUERY_TABLE",
        "bigQueryLoadingTemporaryDirectory": "PATH_TO_TEMP_DIR_ON_GCS"
      },
      "containerSpecGcsPath": "gs://dataflow-templates/VERSION/flex/GCS_Text_to_BigQuery_Xlang",
   }
}

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

  • ‫PROJECT_ID: Google Cloud מזהה הפרויקט שבו רוצים להריץ את משימת Dataflow
  • ‫JOB_NAME: שם ייחודי למשימה, לפי בחירתכם
  • ‫VERSION: גרסת התבנית שבה רוצים להשתמש

    אפשר להשתמש בערכים הבאים:

    • latest כדי להשתמש בגרסה העדכנית של התבנית, שזמינה בתיקיית ההורה ללא תאריך בקטגוריה – gs://dataflow-templates/latest/
    • שם הגרסה, כמו 2023-09-12-00_RC00, כדי להשתמש בגרסה ספציפית של התבנית, שנמצאת בתיקיית הנתונים מתאריך ספציפי בקטגוריה – gs://dataflow-templates/
  • ‫LOCATION: האזור שבו רוצים לפרוס את משימת Dataflow, לדוגמה us-central1
  • ‫PYTHON_FUNCTION: השם של הפונקציה בהגדרת המשתמש (UDF) ב-Python שבה רוצים להשתמש.
  • ‫PATH_TO_BIGQUERY_SCHEMA_JSON: הנתיב ב-Cloud Storage לקובץ ה-JSON שמכיל את הגדרת הסכימה
  • ‫PATH_TO_PYTHON_UDF_FILE: ה-URI של Cloud Storage של קובץ הקוד ב-Python שמגדיר את הפונקציה בהגדרת המשתמש (UDF) שבה רוצים להשתמש. לדוגמה, gs://my-bucket/my-udfs/my_file.py.
  • ‫PATH_TO_TEXT_DATA: הנתיב ב-Cloud Storage למערך הנתונים של הטקסט
  • ‫BIGQUERY_TABLE: שם הטבלה ב-BigQuery
  • ‫PATH_TO_TEMP_DIR_ON_GCS: הנתיב ב-Cloud Storage לספרייה הזמנית

המאמרים הבאים