תרגום שאילתות SQL באמצעות Translate API
במאמר הזה מוסבר איך להשתמש ב-Translation API ב-BigQuery כדי לתרגם סקריפטים שנכתבו בניבים אחרים של SQL לשאילתות GoogleSQL. Translation API יכול לפשט את תהליך העברת עומסי עבודה ל-BigQuery.
לפני שמתחילים
לפני ששולחים עבודת תרגום, צריך לבצע את השלבים הבאים:
- מוודאים שיש לכם את כל ההרשאות הנדרשות.
- מפעילים את BigQuery Migration API.
- אוספים את קובצי המקור שמכילים את הסקריפטים והשאילתות של SQL שרוצים לתרגם.
- מעלים את קובצי המקור ל-Cloud Storage.
ההרשאות הנדרשות
כדי לקבל את ההרשאות שנדרשות ליצירת משימות תרגום באמצעות Translation API, צריך לבקש מהאדמין להקצות לכם ב-IAM את התפקיד MigrationWorkflow Editor (roles/bigquerymigration.editor) במשאב parent.
להסבר על מתן תפקידים, קראו איך מנהלים את הגישה ברמת הפרויקט, התיקייה והארגון.
זהו תפקיד שמוגדר מראש וכולל את ההרשאות שנדרשות ליצירת משימות תרגום באמצעות Translation API. כדי לראות בדיוק אילו הרשאות נדרשות, אפשר להרחיב את הקטע ההרשאות הנדרשות:
ההרשאות הנדרשות
כדי ליצור משימות תרגום באמצעות Translation API, נדרשות ההרשאות הבאות:
-
bigquerymigration.workflows.create -
bigquerymigration.workflows.get
יכול להיות שתקבלו את ההרשאות האלה באמצעות תפקידים בהתאמה אישית או תפקידים מוגדרים מראש אחרים.
הפעלת BigQuery Migration API
אם הפרויקט שלכם ב-Google Cloud CLI נוצר לפני 15 בפברואר 2022, צריך להפעיל את BigQuery Migration API באופן הבא:
במסוף Google Cloud , עוברים לדף BigQuery Migration API.
לוחצים על Enable.
העלאת קובצי קלט ל-Cloud Storage
אם רוצים להשתמש במסוף Google Cloud או ב-BigQuery Migration API כדי לבצע עבודת תרגום, צריך להעלות ל-Cloud Storage את קובצי המקור שמכילים את השאילתות והסקריפטים שרוצים לתרגם. אפשר גם להעלות קבצים של מטא-נתונים או קבצים של הגדרות בפורמט YAML לאותה קטגוריה של Cloud Storage שמכילה את קובצי המקור. מידע נוסף על יצירת קטגוריות והעלאת קבצים ל-Cloud Storage זמין במאמרים בנושא יצירת קטגוריות והעלאת אובייקטים ממערכת קבצים.
סוגי המשימות הנתמכים
Translation API יכול לתרגם את הניבים הבאים של SQL ל-GoogleSQL:
- Amazon Redshift SQL –
Redshift2BigQuery_Translation - Apache HiveQL ו-Beeline CLI –
HiveQL2BigQuery_Translation - Apache Impala –
Impala2BigQuery_Translation - Apache Spark SQL –
SparkSQL2BigQuery_Translation - Azure Synapse T-SQL –
AzureSynapse2BigQuery_Translation - GoogleSQL (BigQuery) –
Bigquery2Bigquery_Translation - Greenplum SQL –
Greenplum2BigQuery_Translation - IBM Db2 SQL –
Db22BigQuery_Translation - IBM Netezza SQL ו-NZPLSQL –
Netezza2BigQuery_Translation - MySQL SQL –
MySQL2BigQuery_Translation - Oracle SQL, PL/SQL, Exadata -
Oracle2BigQuery_Translation - PostgreSQL SQL –
Postgresql2BigQuery_Translation - Presto או Trino SQL –
Presto2BigQuery_Translation - Snowflake SQL –
Snowflake2BigQuery_Translation - SQLite –
SQLite2BigQuery_Translation - SQL Server T-SQL –
SQLServer2BigQuery_Translation - Teradata ו-Teradata Vantage –
Teradata2BigQuery_Translation - Vertica SQL –
Vertica2BigQuery_Translation
טיפול בפונקציות SQL שלא נתמכות באמצעות פונקציות UDF מסייעות
כשמתרגמים SQL מדיאלקט מקור ל-BigQuery, יכול להיות שלחלק מהפונקציות אין מקבילה ישירה. כדי לפתור את הבעיה הזו, שירות ההעברה ל-BigQuery (וגם קהילת BigQuery הרחבה) מספק פונקציות עזר מוגדרות על ידי המשתמש (UDF) שמשכפלות את ההתנהגות של הפונקציות האלה של דיאלקט המקור שלא נתמכות.
פונקציות UDF כאלה נמצאות לרוב במערך הנתונים הציבורי bqutil, כך ששאילתות מתורגמות יכולות להפנות אליהן בהתחלה באמצעות הפורמט bqutil.<dataset>.<function>(). לדוגמה, bqutil.fn.cw_count().
שיקולים חשובים לגבי סביבות ייצור:
למרות ש-bqutil מספק גישה נוחה לפונקציות העזר האלה של UDF לצורך תרגום ובדיקה ראשוניים, לא מומלץ להסתמך ישירות על bqutil לעומסי עבודה של ייצור מכמה סיבות:
- ניהול גרסאות: פרויקט
bqutilמארח את הגרסה העדכנית של הפונקציות האלה, כלומר ההגדרות שלהן יכולות להשתנות לאורך זמן. הסתמכות ישירה עלbqutilעלולה להוביל להתנהגות בלתי צפויה או לשינויים שוברים בשאילתות הייצור שלכם אם הלוגיקה של UDF מתעדכנת. - בידוד תלות: פריסת פונקציות UDF בפרויקט שלכם מבודדת את סביבת הייצור משינויים חיצוניים.
- התאמה אישית: יכול להיות שתצטרכו לשנות או לבצע אופטימיזציה של הפונקציות המוגדרות על ידי המשתמש כדי שיתאימו יותר ללוגיקה העסקית הספציפית או לדרישות הביצועים שלכם. הפעולה הזו אפשרית רק אם הם נמצאים בפרויקט שלכם.
- אבטחה וניהול: יכול להיות שמדיניות האבטחה של הארגון שלכם מגבילה גישה ישירה למערכי נתונים ציבוריים כמו
bqutilלעיבוד נתוני ייצור. העתקת פונקציות UDF לסביבה המבוקרת שלכם תואמת למדיניות כזו.
פריסת פונקציות UDF מסוג helper בפרויקט:
כדי להשתמש בפונקציות העזר האלה בייצור בצורה מהימנה ויציבה, צריך לפרוס אותן בפרויקט ובמערך הנתונים שלכם. כך יש לכם שליטה מלאה בגרסה, בהתאמה האישית ובגישה שלהם. הוראות מפורטות להטמעה של פונקציות UDF זמינות במדריך להטמעה של פונקציות UDF ב-GitHub. במדריך הזה מפורטים הסקריפטים והשלבים שנדרשים כדי להעתיק את הפונקציות המוגדרות על ידי המשתמש לסביבה שלכם.
מיקומים
Translation API זמין במיקומי העיבוד הבאים:
| תיאור האזור | שם האזור | פרטים | |
|---|---|---|---|
| אסיה והאוקיינוס השקט | |||
| דלהי | asia-south2 |
||
| הונג קונג | asia-east2 |
||
| ג'קארטה | asia-southeast2 |
||
| מלבורן | australia-southeast2 |
||
| מומבאי | asia-south1 |
||
| אוסקה | asia-northeast2 |
||
| סיאול | asia-northeast3 |
||
| סינגפור | asia-southeast1 |
||
| סידני | australia-southeast1 |
||
| טייוואן | asia-east1 |
||
| טוקיו | asia-northeast1 |
||
| אירופה | |||
| בלגיה | europe-west1 |
|
|
| ברלין | europe-west10 |
||
| מספר אזורים באיחוד האירופי | eu |
||
| פינלנד | europe-north1 |
|
|
| פרנקפורט | europe-west3 |
||
| לונדון | europe-west2 |
|
|
| מדריד | europe-southwest1 |
|
|
| מילאנו | europe-west8 |
||
| הולנד | europe-west4 |
|
|
| פריז | europe-west9 |
|
|
| שטוקהולם | europe-north2 |
|
|
| טורינו | europe-west12 |
||
| ורשה | europe-central2 |
||
| ציריך | europe-west6 |
|
|
| אמריקה | |||
| קולומבוס, אוהיו | us-east5 |
||
| דאלאס | us-south1 |
|
|
| אייווה | us-central1 |
|
|
| לאס וגאס | us-west4 |
||
| לוס אנג'לס | us-west2 |
||
| מקסיקו | northamerica-south1 |
||
| צפון וירג'יניה | us-east4 |
||
| אורגון | us-west1 |
|
|
| קוויבק | northamerica-northeast1 |
|
|
| סאו פאולו | southamerica-east1 |
|
|
| סולט לייק סיטי | us-west3 |
||
| סנטיאגו | southamerica-west1 |
|
|
| דרום קרוליינה | us-east1 |
||
| טורונטו | northamerica-northeast2 |
|
|
| ארה"ב במספר אזורים | us |
||
| אפריקה | |||
| יוהנסבורג | africa-south1 |
||
| MiddleEast | |||
| דמאם | me-central2 |
||
| דוחה | me-central1 |
||
| ישראל | me-west1 |
||
שליחת עבודת תרגום
כדי לשלוח משימת תרגום באמצעות Translation API, משתמשים ב-method projects.locations.workflows.create ומספקים מופע של המשאב MigrationWorkflow עם סוג משימה נתמך.
אחרי ששולחים את העבודה, אפשר להריץ שאילתה כדי לקבל תוצאות.
יצירת תרגום באצווה
הפקודה curl הבאה יוצרת משימת תרגום באצווה שבה קובצי הקלט והפלט מאוחסנים ב-Cloud Storage. השדה source_target_mapping מכיל רשימה שממפה את הערכים של מקור literal לנתיב יחסי אופציונלי של פלט היעד.
curl -d "{
\"tasks\": {
string: {
\"type\": \"TYPE\",
\"translation_details\": {
\"target_base_uri\": \"TARGET_BASE\",
\"source_target_mapping\": {
\"source_spec\": {
\"base_uri\": \"BASE\"
}
},
\"target_types\": \"TARGET_TYPES\",
}
}
}
}" \
-H "Content-Type:application/json" \
-H "Authorization: Bearer TOKEN" -X POST https://bigquerymigration.googleapis.com/v2alpha/projects/PROJECT_ID/locations/LOCATION/workflows
מחליפים את מה שכתוב בשדות הבאים:
-
TYPE: סוג המשימה של התרגום, שקובע את הדיאלקט של שפת המקור ושפת היעד. -
TARGET_BASE: ה-URI הבסיסי של כל פלט התרגום. -
BASE: ה-URI הבסיסי של כל הקבצים שנקראים כמקורות לתרגום.
TARGET_TYPES(אופציונלי): סוגי הפלט שנוצרו. אם לא מציינים, נוצר SQL.-
sql(ברירת מחדל): קובצי שאילתות ה-SQL המתורגמות. -
suggestion: הצעות שנוצרו על ידי AI.
הפלט מאוחסן בתיקיית משנה בתיקיית הפלט. שם תיקיית המשנה נקבע לפי הערך ב-
TARGET_TYPES.-
TOKEN: הטוקן לאימות. כדי ליצור אסימון, משתמשים בפקודהgcloud auth print-access-tokenאו ב-OAuth 2.0 playground (צריך להשתמש בהיקףhttps://www.googleapis.com/auth/cloud-platform).
PROJECT_ID: הפרויקט שבו תתבצע התרגום.
LOCATION: המיקום שבו המשימה מעובדת.
הפקודה הקודמת מחזירה תשובה שכוללת מזהה של תהליך עבודה בפורמט projects/PROJECT_ID/locations/LOCATION/workflows/WORKFLOW_ID.
דוגמה לתרגום באצווה
כדי לתרגם את סקריפטי ה-SQL של Teradata בספריית Cloud Storage gs://my_data_bucket/teradata/input/ ולאחסן את התוצאות בספריית Cloud Storage gs://my_data_bucket/teradata/output/, אפשר להשתמש בשאילתה הבאה:
{
"tasks": {
"task_name": {
"type": "Teradata2BigQuery_Translation",
"translation_details": {
"target_base_uri": "gs://my_data_bucket/teradata/output/",
"source_target_mapping": {
"source_spec": {
"base_uri": "gs://my_data_bucket/teradata/input/"
}
},
}
}
}
}
הקריאה הזו תחזיר הודעה שמכילה את מזהה תהליך העבודה שנוצר בשדה "name":
{
"name": "projects/123456789/locations/us/workflows/12345678-9abc-def1-2345-6789abcdef00",
"tasks": {
"task_name": { /*...*/ }
},
"state": "RUNNING"
}
כדי לקבל את הסטטוס המעודכן של תהליך העבודה, מריצים שאילתת GET.
העבודה שולחת פלט ל-Cloud Storage במהלך ההתקדמות שלה. סטטוס המשימה state
משתנה לCOMPLETED אחרי שכל target_types המבוקשים נוצרים.
אם המשימה מצליחה, אפשר למצוא את שאילתת ה-SQL המתורגמת ב-gs://my_data_bucket/teradata/output.
דוגמה לתרגום באצווה עם הצעות מבוססות-AI
בדוגמה הבאה, התסריטים של Teradata SQL שנמצאים בספרייה gs://my_data_bucket/teradata/input/ ב-Cloud Storage מתורגמים, והתוצאות מאוחסנות בספרייה gs://my_data_bucket/teradata/output/ ב-Cloud Storage עם הצעה נוספת מ-AI:
{
"tasks": {
"task_name": {
"type": "Teradata2BigQuery_Translation",
"translation_details": {
"target_base_uri": "gs://my_data_bucket/teradata/output/",
"source_target_mapping": {
"source_spec": {
"base_uri": "gs://my_data_bucket/teradata/input/"
}
},
"target_types": "suggestion",
}
}
}
}
אחרי שהמשימה תפעל בהצלחה, ההצעות מבוססות-AI יופיעו בספרייה gs://my_data_bucket/teradata/output/suggestion ב-Cloud Storage.
יצירת משימת תרגום אינטראקטיבית עם קלט ופלט של מחרוזות מילוליות
הפקודה curl הבאה יוצרת משימת תרגום עם קלט ופלט של מחרוזות מילוליות. השדה source_target_mapping מכיל רשימה שממפה את ספריות המקור לנתיב יחסי אופציונלי של פלט היעד.
curl -d "{
\"tasks\": {
string: {
\"type\": \"TYPE\",
\"translation_details\": {
\"source_target_mapping\": {
\"source_spec\": {
\"literal\": {
\"relative_path\": \"PATH\",
\"literal_string\": \"STRING\"
}
}
},
\"target_return_literals\": \"TARGETS\",
}
}
}
}" \
-H "Content-Type:application/json" \
-H "Authorization: Bearer TOKEN" -X POST https://bigquerymigration.googleapis.com/v2alpha/projects/PROJECT_ID/locations/LOCATION/workflows
מחליפים את מה שכתוב בשדות הבאים:
-
TYPE: סוג המשימה של התרגום, שקובע את הדיאלקט של שפת המקור ושפת היעד. -
PATH: המזהה של הרשומה המילולית, בדומה לשם קובץ או לנתיב. -
STRING: מחרוזת של נתוני קלט מילוליים (לדוגמה, SQL) שצריך לתרגם. -
TARGETS: היעדים הצפויים שהמשתמש רוצה שיוחזרו ישירות בתגובה בפורמטliteral. הם צריכים להיות בפורמט של URI יעד (לדוגמה, GENERATED_DIR +target_spec.relative_path+source_spec.literal.relative_path). כל מה שלא מופיע ברשימה הזו לא יוחזר בתשובה. הספרייה שנוצרת, GENERATED_DIR לתרגומים כלליים של SQL היאsql/. -
TOKEN: הטוקן לאימות. כדי ליצור אסימון, משתמשים בפקודהgcloud auth print-access-tokenאו ב-OAuth 2.0 playground (צריך להשתמש בהיקףhttps://www.googleapis.com/auth/cloud-platform). -
PROJECT_ID: הפרויקט שבו תתבצע התרגום. -
LOCATION: המיקום שבו המשימה מעובדת.
הפקודה הקודמת מחזירה תשובה שכוללת מזהה של תהליך עבודה בפורמט projects/PROJECT_ID/locations/LOCATION/workflows/WORKFLOW_ID.
אחרי שהעבודה מסתיימת, אפשר לראות את התוצאות על ידי שאילתת העבודה ובדיקת השדה translation_literals בשורה בתשובה אחרי שהזרימת העבודה מסתיימת.
דוגמה לתרגום אינטראקטיבי
כדי לתרגם את מחרוזת ה-Hive SQL select 1 באופן אינטראקטיבי, אפשר להשתמש בשאילתה הבאה:
"tasks": {
string: {
"type": "HiveQL2BigQuery_Translation",
"translation_details": {
"source_target_mapping": {
"source_spec": {
"literal": {
"relative_path": "input_file",
"literal_string": "select 1"
}
}
},
"target_return_literals": "sql/input_file",
}
}
}
אפשר להשתמש בכל relative_path שרוצים עבור המחרוזת המילולית, אבל המחרוזת המילולית המתורגמת תופיע בתוצאות רק אם כוללים את sql/$relative_path בtarget_return_literals. אפשר גם לכלול כמה מחרוזות מילוליות בשאילתה אחת. במקרה כזה, צריך לכלול את הנתיב היחסי של כל אחת מהן ב-target_return_literals.
הקריאה הזו תחזיר הודעה שמכילה את מזהה תהליך העבודה שנוצר בשדה "name":
{
"name": "projects/123456789/locations/us/workflows/12345678-9abc-def1-2345-6789abcdef00",
"tasks": {
"task_name": { /*...*/ }
},
"state": "RUNNING"
}
כדי לקבל את הסטטוס המעודכן של תהליך העבודה, מריצים שאילתת GET.
המשימה מסתיימת כש"state" משתנה לCOMPLETED. אם המשימה תצליח, ה-SQL המתורגם יופיע בהודעת התגובה:
{
"name": "projects/123456789/locations/us/workflows/12345678-9abc-def1-2345-6789abcdef00",
"tasks": {
"string": {
"id": "0fedba98-7654-3210-1234-56789abcdef",
"type": "HiveQL2BigQuery_Translation",
/* ... */
"taskResult": {
"translationTaskResult": {
"translatedLiterals": [
{
"relativePath": "sql/input_file",
"literalString": "-- Translation time: 2023-10-05T21:50:49.885839Z\n-- Translation job ID: projects/123456789/locations/us/workflows/12345678-9abc-def1-2345-6789abcdef00\n-- Source: input_file\n-- Translated from: Hive\n-- Translated to: BigQuery\n\nSELECT\n 1\n;\n"
}
],
"reportLogMessages": [
...
]
}
},
/* ... */
}
},
"state": "COMPLETED",
"createTime": "2023-10-05T21:50:49.543221Z",
"lastUpdateTime": "2023-10-05T21:50:50.462758Z"
}
בדיקת פלט התרגום
אחרי שמריצים את משימת התרגום, מאחזרים את התוצאות באמצעות ציון מזהה זרימת העבודה של משימת התרגום באמצעות הפקודה הבאה:
curl \ -H "Content-Type:application/json" \ -H "Authorization:Bearer TOKEN" -X GET https://bigquerymigration.googleapis.com/v2alpha/projects/PROJECT_ID/locations/LOCATION/workflows/WORKFLOW_ID
מחליפים את מה שכתוב בשדות הבאים:
-
TOKEN: הטוקן לאימות. כדי ליצור אסימון, משתמשים בפקודהgcloud auth print-access-tokenאו ב-OAuth 2.0 playground (צריך להשתמש בהיקףhttps://www.googleapis.com/auth/cloud-platform). -
PROJECT_ID: הפרויקט שבו תתבצע התרגום. -
LOCATION: המיקום שבו המשימה מעובדת. -
WORKFLOW_ID: המזהה שנוצר כשיוצרים תהליך עבודה לתרגום.
התשובה מכילה את הסטטוס של תהליך העבודה של ההעברה, וכל הקבצים שהושלמו ב-target_return_literals.
התשובה תכיל את הסטטוס של תהליך העבודה של ההעברה, וכל קובץ שההעברה שלו הסתיימה ב-target_return_literals. אפשר לבדוק את נקודת הקצה הזו כדי לראות את הסטטוס של תהליך העבודה.