יצירת שאילתות מתמשכות
במאמר הזה מוסבר איך להריץ שאילתה מתמשכת ב-BigQuery.
שאילתות מתמשכות ב-BigQuery הן הצהרות SQL שפועלות באופן רציף ומעבדות נתונים כמעט בזמן אמת. אתם יכולים לכתוב או לייצא את שורות הפלט שנוצרו על ידי שאילתה מתמשכת ליעדים הבאים:
- טבלאות ב-BigQuery
- טבלאות מנוהלות של Apache Iceberg
- נושאי Pub/Sub
- טבלאות Bigtable
- טבלאות Spanner
בחירת סוג החשבון
אתם יכולים ליצור ולהריץ משימת שאילתה מתמשכת באמצעות חשבון משתמש, או ליצור משימת שאילתה מתמשכת באמצעות חשבון משתמש ואז להריץ אותה באמצעות חשבון שירות. כדי להריץ שאילתה מתמשכת שמייצאת תוצאות לנושא Pub/Sub, צריך להשתמש בחשבון שירות.
כשמשתמשים בחשבון משתמש, שאילתה מתמשכת פועלת עד יומיים. כשמשתמשים בחשבון שירות, שאילתה מתמשכת פועלת עד 150 יום. מידע נוסף זמין במאמר הרשאה.
ההרשאות הנדרשות
בקטע הזה מפורטות ההרשאות שנדרשות כדי ליצור ולהריץ שאילתה מתמשכת. במקום התפקידים בניהול הזהויות והרשאות הגישה (IAM) שצוינו, אתם יכולים לקבל את ההרשאות הנדרשות באמצעות תפקידים בהתאמה אישית.
ההרשאות שנדרשות כשמשתמשים בחשבון משתמש
בקטע הזה מוסבר אילו תפקידים והרשאות נדרשים כדי ליצור ולהריץ שאילתה מתמשכת באמצעות חשבון משתמש.
כדי ליצור משימה ב-BigQuery, לחשבון המשתמש צריכה להיות הרשאת ה-IAM bigquery.jobs.create. כל אחד מהתפקידים הבאים ב-IAM נותן את ההרשאה bigquery.jobs.create:
- BigQuery User (
roles/bigquery.user) - BigQuery Job User (
roles/bigquery.jobUser) (שימוש במשימות BigQuery) - אדמין ב-BigQuery (
roles/bigquery.admin)
כדי לייצא נתונים מטבלה ב-BigQuery, לחשבון המשתמש צריכה להיות הרשאת ה-IAM bigquery.tables.export. כל אחד מהתפקידים הבאים ב-IAM נותן את ההרשאה bigquery.tables.export:
- BigQuery Data Viewer (
roles/bigquery.dataViewer) (צפייה בנתוני BigQuery) - עריכה של נתוני BigQuery (
roles/bigquery.dataEditor) - בעלים של נתוני BigQuery (
roles/bigquery.dataOwner) - אדמין ב-BigQuery (
roles/bigquery.admin)
כדי לכתוב נתונים בטבלה ב-BigQuery, לחשבון המשתמש צריכה להיות הרשאת ה-IAM bigquery.tables.updateData. כל אחד מהתפקידים הבאים ב-IAM נותן את ההרשאה bigquery.tables.updateData:
- עריכה של נתוני BigQuery (
roles/bigquery.dataEditor) - בעלים של נתוני BigQuery (
roles/bigquery.dataOwner) - אדמין ב-BigQuery (
roles/bigquery.admin)
אם צריך להפעיל בחשבון המשתמש את ממשקי ה-API שנדרשים לתרחיש לדוגמה של השאילתה המתמשכת, צריך להקצות לחשבון המשתמש את התפקיד אדמין של שימוש בשירות (roles/serviceusage.serviceUsageAdmin).
roles/bigquery.connectionUser) כדי להשתמש בחיבור למשאב Google Cloud שמשויך לטבלה המנוהלת של Iceberg. בנוסף, לחשבון השירות שמשויך לחיבור הזה צריכות להיות ההרשאות המתאימות (לדוגמה, roles/storage.objectUser ו-roles/storage.legacyBucketReader) בקטגוריה הבסיסית של Cloud Storage. מידע נוסף זמין במאמר יצירה ושימוש בטבלאות מנוהלות של Apache Iceberg.
ההרשאות שנדרשות כשמשתמשים בחשבון שירות
בקטע הזה מפורט מידע על התפקידים וההרשאות שנדרשים לחשבון המשתמש שיוצר את השאילתה המתמשכת, ולחשבון השירות שמריץ את השאילתה המתמשכת.
הרשאות בחשבון המשתמש
כדי ליצור משימה ב-BigQuery, לחשבון המשתמש צריכה להיות הרשאת ה-IAM bigquery.jobs.create. כל אחד מהתפקידים הבאים ב-IAM נותן את ההרשאה bigquery.jobs.create:
- BigQuery User (
roles/bigquery.user) - BigQuery Job User (
roles/bigquery.jobUser) (שימוש במשימות BigQuery) - אדמין ב-BigQuery (
roles/bigquery.admin)
כדי לשלוח משימה שפועלת באמצעות חשבון שירות, לחשבון המשתמש צריך להיות התפקיד משתמש בחשבון שירות (roles/iam.serviceAccountUser). אם אתם משתמשים באותו חשבון משתמש כדי ליצור את חשבון השירות, לחשבון המשתמש צריך להיות התפקיד אדמין של חשבון שירות (roles/iam.serviceAccountAdmin). במאמר הקצאת תפקיד יחיד מוסבר איך להגביל את הגישה של משתמש לחשבון שירות אחד, במקום לכל חשבונות השירות בפרויקט.
אם צריך להפעיל בחשבון המשתמש את ממשקי ה-API שנדרשים לתרחיש לדוגמה של השאילתה המתמשכת, צריך להקצות לחשבון המשתמש את התפקיד אדמין של שימוש בשירות (roles/serviceusage.serviceUsageAdmin).
הרשאות של חשבון שירות
כדי לייצא נתונים מטבלה ב-BigQuery, לחשבון השירות צריכה להיות הרשאת ה-IAM bigquery.tables.export. כל אחד מהתפקידים הבאים ב-IAM נותן את ההרשאה bigquery.tables.export:
- BigQuery Data Viewer (
roles/bigquery.dataViewer) (צפייה בנתוני BigQuery) - עריכה של נתוני BigQuery (
roles/bigquery.dataEditor) - בעלים של נתוני BigQuery (
roles/bigquery.dataOwner) - אדמין ב-BigQuery (
roles/bigquery.admin)
bigquery.tables.updateData. כל אחד מהתפקידים הבאים ב-IAM נותן את ההרשאה bigquery.tables.updateData:
- עריכה של נתוני BigQuery (
roles/bigquery.dataEditor) - בעלים של נתוני BigQuery (
roles/bigquery.dataOwner) - אדמין ב-BigQuery (
roles/bigquery.admin)
roles/bigquery.connectionUser) כדי להשתמש בחיבור למשאב Google Cloud שמשויך לטבלה המנוהלת של Iceberg. בנוסף, לחשבון השירות שמשויך לחיבור הזה צריכות להיות ההרשאות המתאימות (לדוגמה, roles/storage.objectUser ו-roles/storage.legacyBucketReader) בקטגוריה הבסיסית של Cloud Storage. מידע נוסף זמין במאמר יצירה ושימוש בטבלאות מנוהלות של Apache Iceberg.
לפני שמתחילים
-
בדף לבחירת הפרויקט במסוף Google Cloud , בוחרים פרויקט ב- Google Cloud או יוצרים אותו.
התפקידים שנדרשים כדי לבחור או ליצור פרויקט
- בחירת פרויקט: כדי לבחור פרויקט לא נדרש תפקיד IAM ספציפי – אתם יכולים לבחור כל פרויקט שקיבלתם בו תפקיד.
-
יצירת פרויקט: כדי ליצור פרויקט, צריך את התפקיד "יצירת פרויקטים" (
roles/resourcemanager.projectCreator), שכולל את ההרשאהresourcemanager.projects.create. איך מקצים תפקידים?
-
מפעילים את BigQuery API, אם הוא עדיין לא מופעל.
התפקידים שנדרשים כדי להפעיל ממשקי API
כדי להפעיל ממשקי API, צריך את ההרשאה
serviceusage.services.enable. אם יצרתם את הפרויקט, סביר להניח שכבר יש לכם את ההרשאה הזו דרך התפקיד "בעלים" (roles/owner). אחרת, תוכלו לקבל את ההרשאה הזו דרך התפקיד "אדמין בממשק 'שימוש בשירות'" (roles/serviceusage.serviceUsageAdmin). איך מקצים תפקידים
יצירת בקשה לשמירת מקום
יוצרים הזמנה במהדורת Enterprise או Enterprise Plus, ואז יוצרים הקצאת הזמנה עם סוג משימה CONTINUOUS. בהזמנה הזו אפשר להשתמש בהתאמה לעומס (autoscaling) ובשיתוף משבצות לא פעילות.
יש מגבלות שחלות על הקצאת הזמנות לשאילתות מתמשכות.
ייצוא ל-Pub/Sub
כדי לייצא נתונים ל-Pub/Sub, צריך ממשקי API, הרשאות IAM ומשאבים Google Cloud נוספים. מידע נוסף על ייצוא ל-Pub/Sub
עיבוד מוטציות באמצעות CHANGES
כשמייצאים נתונים ל-Pub/Sub, אפשר להשתמש בפונקציית היסטוריית השינויים של CHANGES.
הפונקציה CHANGES מעבדת את כל השורות שהשתנו בטבלת המקור, כולל הוספות ושינויים.
הטמעת מאפיינים מותאמים אישית כמטא-נתונים בהודעות Pub/Sub
אפשר להשתמש במאפייני Pub/Sub כדי לספק מידע נוסף על ההודעה, כמו העדיפות, המקור, היעד או מטא-נתונים נוספים. אפשר גם להשתמש במאפיינים כדי לסנן הודעות במינוי.
בתוצאה של שאילתה מתמשכת, אם עמודה נקראת _ATTRIBUTES, הערכים שלה מועתקים למאפייני ההודעה ב-Pub/Sub.
השדות שסופקו ב-_ATTRIBUTES משמשים כמפתחות של מאפיינים.
העמודה _ATTRIBUTES צריכה להיות מסוג JSON, בפורמט ARRAY<STRUCT<STRING, STRING>> או STRUCT<STRING>.
דוגמה לייצוא נתונים לנושא Pub/Sub
ייצוא ל-Bigtable
כדי לייצא נתונים ל-Bigtable, צריך ממשקי API נוספים, הרשאות IAM ומשאבים של Google Cloud. מידע נוסף זמין במאמר ייצוא ל-Bigtable.
ייצוא ל-Spanner
כדי לייצא נתונים ל-Spanner, צריך ממשקי API נוספים, הרשאות IAM ומשאבי Google Cloud. מידע נוסף זמין במאמר ייצוא ל-Spanner (ETL הפוך).
כתיבת נתונים בטבלה ב-BigQuery או בטבלאות מנוהלות של Apache Iceberg
אתם יכולים לכתוב נתונים בטבלה ב-BigQuery או בטבלה מנוהלת של Iceberg באמצעות הצהרת INSERT.
כשכותבים פלט של שאילתה מתמשכת בטבלה מנוהלת של Iceberg:
- טבלת היעד המנוהלת ב-Iceberg צריכה להיות קיימת לפני שיוצרים את השאילתה המתמשכת. הוראות ליצירת טבלה מנוהלת של Iceberg מפורטות במאמר יצירה ושימוש בטבלאות מנוהלות של Apache Iceberg.
- תחביר השאילתה זהה לכתיבה בטבלה רגילה ב-BigQuery. אפשר לציין את טבלת היעד בסעיף
INSERT INTO, ואין צורך לציין אפשרויות חיבור או קטגוריה בהצהרת ה-SQL. - לחשבון המשתמש או לחשבון השירות שמריץ את השאילתה המתמשכת צריכות להיות ההרשאות הנדרשות בטבלת היעד, בחיבור למשאב Google Cloud ובקטגוריה הבסיסית של Cloud Storage. למידע נוסף, קראו את המאמר ההרשאות הנדרשות.
לדוגמה, ראו כתיבת נתונים בטבלה ב-BigQuery או בטבלאות מנוהלות של Apache Iceberg.
שימוש בפונקציות AI
כדי להשתמש בפונקציית AI נתמכת בשאילתה מתמשכת, נדרשים ממשקי API, הרשאות IAM ומשאבים Google Cloudנוספים. למידע נוסף, תוכלו לקרוא את אחד מהנושאים הבאים, בהתאם לתרחיש לדוגמה:
- יצירת טקסט באמצעות הפונקציה
AI.GENERATE_TEXT - יצירת הטמעות טקסט באמצעות הפונקציה
AI.GENERATE_EMBEDDING - הבנת טקסט באמצעות הפונקציה
ML.UNDERSTAND_TEXT - תרגום טקסט באמצעות הפונקציה
ML.TRANSLATE
כשמשתמשים בפונקציית AI בשאילתה מתמשכת, חשוב לוודא שפלט השאילתה לא יחרוג מהמכסה של הפונקציה. אם חורגים מהמכסה, יכול להיות שתצטרכו לטפל בנפרד ברשומות שלא עובדו.
מציינים שעת התחלה לשאילתה המתמשכת.
כדי לציין את הנתונים המוקדמים ביותר לעיבוד, צריך להשתמש בפונקציה APPENDS, או בפונקציה CHANGES במקרה של ייצוא ל-Pub/Sub, בסעיף FROM של שאילתה מתמשכת. לדוגמה, APPENDS(TABLE my_table, start_timestamp).
הארגומנט start_timestamp מגדיר את נקודת הזמן שבה השאילתה המתמשכת מתחילה לעבד נתונים. לדוגמה, הערך APPENDS(TABLE my_table, CURRENT_TIMESTAMP() - INTERVAL 10 MINUTE) מורה ל-BigQuery לעבד נתונים שנוספו לטבלה my_table עד 10 דקות לפני תחילת השאילתה המתמשכת.
נתונים שנוספים ל-my_table לאחר מכן מעובדים כשהם מגיעים. אין עיכוב בעיבוד הנתונים.
כשמציינים את הארגומנט start_timestamp, הערך חייב להיות בטווח של חלון המסע בזמן של הטבלה, שמוגדר כברירת מחדל ל-7 ימים בטבלאות רגילות. אם מגדירים את start_timestamp ל-NULL, ברירת המחדל היא זמן היצירה של הטבלה. לא מומלץ להשתמש בערך NULL, כי אם הטבלה נוצרה לפני חלון הזמן של המסע בזמן, תוחזר שגיאה. שאילתה שמשתמשת ב-NULL עשויה להצליח בטבלה שנוצרה לאחרונה, אבל להיכשל מאוחר יותר אם חותמת הזמן של יצירת הטבלה חורגת מחלון שבעת הימים.
אל תספקו ארגומנט end_timestamp לפונקציה APPENDS כשאתם משתמשים בה בשאילתה מתמשכת.
בדוגמה הבאה מוסבר איך להתחיל שאילתה מתמשכת מנקודת זמן מסוימת באמצעות הפונקציה APPENDS, כששולחים שאילתה לטבלה ב-BigQuery שמקבלת מידע בסטרימינג על נסיעות במונית:
EXPORT DATA OPTIONS (format = 'CLOUD_PUBSUB', uri = 'https://pubsub.googleapis.com/projects/myproject/topics/taxi-real-time-rides') AS ( SELECT TO_JSON_STRING(STRUCT(ride_id, timestamp, latitude, longitude)) AS message FROM APPENDS(TABLE `myproject.real_time_taxi_streaming.taxirides`, -- Configure the APPENDS TVF start_timestamp to specify when you want to -- start processing data using your continuous query. -- This example starts processing at 10 minutes before the current time. CURRENT_TIMESTAMP() - INTERVAL 10 MINUTE) WHERE ride_status = 'enroute');
צריך לציין נקודת התחלה שמוקדמת מחלון הזמן של הנסיעה בזמן
כדי לכלול נתונים שנמצאים מחוץ לחלון של שבעת הימים, אפשר להשתמש בשאילתה רגילה כדי למלא את הנתונים עד לנקודת זמן מסוימת, ואז להתחיל שאילתה מתמשכת מאותה נקודה. חותמת הזמן של "ההעברה" חייבת להיות בטווח של שבעה ימים, כדי שהשאילתה המתמשכת תוכל להמשיך מהמקום שבו השאילתה הרגילה הפסיקה.
בדוגמה הבאה מוסבר איך למלא נתונים ישנים יותר מטבלה ב-BigQuery שמקבלת מידע על נסיעות במונית בסטרימינג, ואז לעבור לשאילתה מתמשכת.
מריצים שאילתה רגילה כדי למלא נתונים עד לנקודת זמן מסוימת:
INSERT INTO `myproject.real_time_taxi_streaming.transformed_taxirides` SELECT timestamp, meter_reading, ride_status, passenger_count, ST_Distance( ST_GeogPoint(pickup_longitude, pickup_latitude), ST_GeogPoint(dropoff_longitude, dropoff_latitude)) AS euclidean_trip_distance, SAFE_DIVIDE(meter_reading, passenger_count) AS cost_per_passenger FROM `myproject.real_time_taxi_streaming.taxirides` -- Include all data inserted into the table up to this handoff point. -- This handoff timestamp must be within the time travel window. FOR SYSTEM_TIME AS OF '2025-01-01 00:00:00 UTC' WHERE ride_status = 'dropoff';
מריצים שאילתה מתמשכת מהנקודה בזמן שבה השאילתה נעצרה:
INSERT INTO `myproject.real_time_taxi_streaming.transformed_taxirides` SELECT timestamp, meter_reading, ride_status, passenger_count, ST_Distance( ST_GeogPoint(pickup_longitude, pickup_latitude), ST_GeogPoint(dropoff_longitude, dropoff_latitude)) AS euclidean_trip_distance, SAFE_DIVIDE(meter_reading, passenger_count) AS cost_per_passenger FROM APPENDS(TABLE `myproject.real_time_taxi_streaming.taxirides`, -- Configure the APPENDS TVF start_timestamp to start processing -- data right where the batch query left off + 1 microsecond. -- This timestamp must be within the time travel window. TIMESTAMP '2025-01-01 00:00:00 UTC' + INTERVAL 1 MICROSECOND) WHERE ride_status = 'dropoff';
הרצת שאילתה מתמשכת באמצעות חשבון משתמש
בקטע הזה מוסבר איך להריץ שאילתה מתמשכת באמצעות חשבון משתמש. אחרי שהשאילתה המתמשכת פועלת, אתם יכולים לסגור את מסוף Google Cloud , את חלון הטרמינל או את האפליקציה בלי להפריע להרצת השאילתה. שאילתה מתמשכת שמופעלת על ידי חשבון משתמש פועלת למשך יומיים לכל היותר, ואז נעצרת באופן אוטומטי. כדי להמשיך לעבד נתונים נכנסים חדשים, צריך להתחיל שאילתה מתמשכת חדשה ולציין נקודת התחלה. כדי להפוך את התהליך הזה לאוטומטי, אפשר לעיין במאמר ניסיון חוזר של שאילתות שנכשלו.
כדי להריץ שאילתה מתמשכת:
המסוף
נכנסים לדף BigQuery במסוף Google Cloud .
בעורך השאילתות, לוחצים על Edit > Query mode > שאילתה מתמשכת. כדי לאשר את הבחירה, לוחצים על Confirm.
אופציונלי: כדי לקבוע כמה זמן השאילתה תפעל, לוחצים על Edit > Query settings ומגדירים את Job timeout באלפיות השנייה.
בעורך השאילתות, מקלידים את הצהרת ה-SQL של השאילתה המתמשכת. הצהרת ה-SQL יכולה להכיל רק פעולות נתמכות.
לוחצים על Run.
BQ
-
מפעילים את Cloud Shell במסוף Google Cloud .
בחלק התחתון של מסוף Google Cloud יתחיל סשן של Cloud Shell ותופיע הודעה של שורת הפקודה. Cloud Shell היא סביבת מעטפת שבה ה-CLI של Google Cloud מותקן ומוגדרים ערכים לפרויקט הקיים. הסשן יופעל תוך כמה שניות.
ב-Cloud Shell, מריצים את השאילתה המתמשכת באמצעות הפקודה
bq queryעם הדגל--continuous:bq query --use_legacy_sql=false --continuous=true 'QUERY'
מחליפים את
QUERYבהצהרת ה-SQL של השאילתה המתמשכת. הצהרת ה-SQL יכולה להכיל רק פעולות נתמכות. אתם יכולים לקבוע כמה זמן השאילתה תפעל באמצעות הדגל--job_timeout_ms.
API
מריצים את השאילתה המתמשכת באמצעות קריאה ל-method jobs.insert.
צריך להגדיר את השדה continuous לערך true ב-JobConfigurationQuery של המשאב Job שמעבירים.
אפשר גם לקבוע כמה זמן השאילתה תפעל באמצעות הגדרת השדה jobTimeoutMs.
curl --request POST \ "https://bigquery.googleapis.com/bigquery/v2/projects/PROJECT_ID/jobs" \ --header "Authorization: Bearer $(gcloud auth print-access-token)" \ --header "Content-Type: application/json; charset=utf-8" \ --data '{"configuration":{"query":{"query":"QUERY","useLegacySql":false,"continuous":true}}}' \ --compressed
מחליפים את מה שכתוב בשדות הבאים:
PROJECT_ID: מזהה הפרויקט.-
QUERY: הצהרת ה-SQL של השאילתה המתמשכת. הצהרת ה-SQL יכולה להכיל רק פעולות נתמכות.
הרצת שאילתה מתמשכת באמצעות חשבון שירות
בקטע הזה מוסבר איך להריץ שאילתה מתמשכת באמצעות חשבון שירות. אחרי שהשאילתה המתמשכת פועלת, אתם יכולים לסגור את מסוף Google Cloud , את חלון הטרמינל או את האפליקציה בלי להפריע להרצת השאילתה. שאילתה מתמשכת שמופעלת באמצעות חשבון שירות יכולה לפעול עד 150 ימים, ואז היא נעצרת באופן אוטומטי. כדי להמשיך לעבד נתונים נכנסים חדשים, צריך להתחיל שאילתה מתמשכת חדשה ולציין נקודת התחלה. כדי להפוך את התהליך הזה לאוטומטי, אפשר לעיין במאמר ניסיון חוזר של שאילתות שנכשלו.
אם אתם משתמשים בחשבון שירות כדי להריץ שאילתה מתמשכת בפרויקטים שונים, אתם צריכים לעדכן את מדיניות הארגון כדי לאפשר צירוף של חשבונות שירות בפרויקט אחד למשאבים בפרויקט אחר. מידע נוסף זמין במאמר הפעלה של צירוף חשבונות שירות בין פרויקטים.
כדי להשתמש בחשבון שירות להרצת שאילתה מתמשכת:
המסוף
- יצירה של חשבון שירות.
- נותנים לחשבון השירות את ההרשאות הנדרשות.
נכנסים לדף BigQuery במסוף Google Cloud .
בעורך השאילתות, לוחצים על Edit > Query mode > שאילתה מתמשכת. כדי לאשר את הבחירה, לוחצים על אישור.
בעורך השאילתות, לוחצים על Edit > Query settings.
בקטע שאילתה מתמשכת, בוחרים את חשבון השירות שיצרתם בתיבה Service account.
אופציונלי: כדי לקבוע כמה זמן השאילתה תפעל, מגדירים את זמן הקצוב לתפוגה של המשימה באלפיות השנייה.
לוחצים על Save.
בעורך השאילתות, מקלידים את הצהרת ה-SQL של השאילתה המתמשכת. הצהרת ה-SQL יכולה להכיל רק פעולות נתמכות.
לוחצים על Run.
BQ
- יצירה של חשבון שירות.
- נותנים לחשבון השירות את ההרשאות הנדרשות.
-
מפעילים את Cloud Shell במסוף Google Cloud .
בחלק התחתון של מסוף Google Cloud יתחיל סשן של Cloud Shell ותופיע הודעה של שורת הפקודה. Cloud Shell היא סביבת מעטפת שבה ה-CLI של Google Cloud מותקן ומוגדרים ערכים לפרויקט הקיים. הסשן יופעל תוך כמה שניות.
מריצים את השאילתה המתמשכת בשורת הפקודה באמצעות הפקודה
bq queryעם הדגלים הבאים:- מגדירים את הדגל
--continuousלערךtrueכדי שהשאילתה תהיה רציפה. - משתמשים בדגל
--connection_propertyכדי לציין את חשבון השירות שבו רוצים להשתמש. - אופציונלי: מגדירים את הדגל
--job_timeout_msכדי להגביל את זמן הריצה של השאילתה.
bq query --project_id=PROJECT_ID --use_legacy_sql=false \ --continuous=true --connection_property=service_account=SERVICE_ACCOUNT_EMAIL \ 'QUERY'
מחליפים את מה שכתוב בשדות הבאים:
PROJECT_ID: מזהה הפרויקט.-
SERVICE_ACCOUNT_EMAIL: כתובת האימייל של חשבון השירות. אפשר לקבל את כתובת האימייל של חשבון השירות בדף Service accounts במסוף Google Cloud . -
QUERY: הצהרת ה-SQL של השאילתה המתמשכת. הצהרת ה-SQL יכולה להכיל רק פעולות נתמכות.
- מגדירים את הדגל
API
- יצירה של חשבון שירות.
- נותנים לחשבון השירות את ההרשאות הנדרשות.
מריצים את השאילתה המתמשכת באמצעות קריאה ל-method
jobs.insert. מגדירים את השדות הבאים במשאבJobConfigurationQueryשל משאבJobשאתם מעבירים:- מגדירים את השדה
continuousלערךtrueכדי שהשאילתה תהיה רציפה. - בשדה
connectionPropertiesמציינים את חשבון השירות שבו רוצים להשתמש.
אפשר גם לקבוע כמה זמן השאילתה תפעל, באמצעות הגדרת השדה
jobTimeoutMsבמשאבJobConfiguration.curl --request POST \ "https://bigquery.googleapis.com/bigquery/v2/projects/PROJECT_ID/jobs" \ --header "Authorization: Bearer $(gcloud auth print-access-token)" \ --header "Content-Type: application/json; charset=utf-8" \ --data '{"configuration":{"query":{"query":"QUERY","useLegacySql":false,"continuous":true,"connectionProperties":[{"key":"service_account","value":"SERVICE_ACCOUNT_EMAIL"}]}}}' \ --compressed
מחליפים את מה שכתוב בשדות הבאים:
PROJECT_ID: מזהה הפרויקט.-
QUERY: הצהרת ה-SQL של השאילתה המתמשכת. הצהרת ה-SQL יכולה להכיל רק פעולות נתמכות. -
SERVICE_ACCOUNT_EMAIL: כתובת האימייל של חשבון השירות. אפשר למצוא את כתובת האימייל של חשבון השירות בדף Service accounts במסוף Google Cloud .
- מגדירים את השדה
יצירת מזהה משרה בהתאמה אישית
לכל משימת שאילתה מוקצה מזהה משימה, שבעזרתו אפשר לחפש את המשימה ולנהל אותה. כברירת מחדל, מזהי המשימות נוצרים באופן אקראי. כדי שיהיה קל יותר לחפש את מזהה המשימה של שאילתה מתמשכת באמצעות היסטוריית המשימות או הכלי לניהול משימות, אתם יכולים להקצות קידומת מותאמת אישית למזהה המשימה:
נכנסים לדף BigQuery במסוף Google Cloud .
בעורך השאילתות, לוחצים על Edit > Query mode > שאילתה מתמשכת.
לוחצים על אישור.
בעורך השאילתות, לוחצים על Edit > Query settings.
בקטע Custom job ID prefix, מזינים קידומת לשם משימה ייעודית.
לוחצים על Save.
עיבוד עם שמירת מצב באמצעות JOIN וצבירת נתונים בחלונות זמן
פעולות עם שמירת מצב מאפשרות לשאילתות מתמשכות לבצע ניתוח מורכב על ידי שמירת מידע על פני כמה שורות או מרווחי זמן. הפעולות האלה כוללות JOIN וצבירת נתונים בחלונות.
למידע מפורט על השימוש בפעולות האלה, קראו את הנושאים הבאים:
- שאילתות מתמשכות
JOINמבצעות התאמות בזמן אמת בין כמה מקורות נתונים שמבוססים על זמן. - צבירה בחלונות מקבצת נתונים בסטרימינג למרווחי זמן עקביים, כדי לנתח אותם באמצעות פונקציות צבירה.
דוגמאות
בדוגמאות הבאות של SQL מוצגים תרחישים נפוצים לשימוש בשאילתות מתמשכות.
ייצוא נתונים לנושא Pub/Sub
בדוגמה הבאה מוצגת שאילתה מתמשכת שמסננת נתונים מטבלה ב-BigQuery, שמקבלת מידע בסטרימינג על נסיעות במונית, ומפרסמת את הנתונים של נסיעות שבוטלו בנושא Pub/Sub בזמן אמת עם מאפייני הודעות:
EXPORT DATA OPTIONS ( format = 'CLOUD_PUBSUB', uri = 'https://pubsub.googleapis.com/projects/myproject/topics/taxi-real-time-rides') AS ( SELECT TO_JSON_STRING( STRUCT( ride_id, timestamp, latitude, longitude)) AS message, TO_JSON( STRUCT( CAST(passenger_comment AS STRING) AS passenger_comment)) FROM CHANGES(TABLE `myproject.real_time_taxi_streaming.taxi_rides`, -- Configure the CHANGES TVF start_timestamp to specify when you want to -- start processing data using your continuous query. -- This example starts processing at 10 minutes before the current time. CURRENT_TIMESTAMP() - INTERVAL 10 MINUTE) WHERE _CHANGE_TYPE = 'DELETE' );
ייצוא נתונים לטבלה ב-Bigtable
בדוגמה הבאה מוצגת שאילתה מתמשכת שמסננת נתונים מטבלה ב-BigQuery שמקבלת מידע בסטרימינג על נסיעות במונית, ומייצאת את הנתונים לטבלה ב-Bigtable בזמן אמת:
EXPORT DATA OPTIONS ( format = 'CLOUD_BIGTABLE', truncate = TRUE, overwrite = TRUE, uri = 'https://bigtable.googleapis.com/projects/myproject/instances/mybigtableinstance/tables/taxi-real-time-rides') AS ( SELECT CAST(CONCAT(ride_id, timestamp, latitude, longitude) AS STRING) AS rowkey, STRUCT( timestamp, latitude, longitude, meter_reading, ride_status, passenger_count) AS features FROM APPENDS(TABLE `myproject.real_time_taxi_streaming.taxirides`, -- Configure the APPENDS TVF start_timestamp to specify when you want to -- start processing data using your continuous query. -- This example starts processing at 10 minutes before the current time. CURRENT_TIMESTAMP() - INTERVAL 10 MINUTE) WHERE ride_status = 'enroute' );
ייצוא נתונים לטבלת Spanner
בדוגמה הבאה מוצגת שאילתה מתמשכת שמסננת נתונים מטבלה ב-BigQuery, שמקבלת מידע בסטרימינג על נסיעות במונית, ואז מייצאת את הנתונים לטבלה ב-Spanner בזמן אמת:
EXPORT DATA OPTIONS ( format = 'CLOUD_SPANNER', uri = 'https://spanner.googleapis.com/projects/myproject/instances/myspannerinstance/databases/taxi-real-time-rides', spanner_options ="""{ "table": "rides", -- To ensure data is written to Spanner in the correct sequence -- during a continuous export, use the change_timestamp_column -- option. This should be mapped to a timestamp column from your -- BigQuery data. If your source data lacks a timestamp, the -- _CHANGE_TIMESTAMP pseudocolumn provided by the APPENDS function -- will be automatically mapped to the "change_timestamp" column. "change_timestamp_column": "change_timestamp" }""" ) AS ( SELECT ride_id, latitude, longitude, meter_reading, ride_status, passenger_count, _CHANGE_TIMESTAMP as change_timestamp FROM APPENDS( TABLE `myproject.real_time_taxi_streaming.taxirides`, -- Configure the APPENDS TVF start_timestamp to specify when you want to -- start processing data using your continuous query. -- This example starts processing at 10 minutes before the current time. CURRENT_TIMESTAMP() - INTERVAL 10 MINUTE) WHERE ride_status = 'enroute' );
כתיבת נתונים בטבלה ב-BigQuery או בטבלאות מנוהלות של Apache Iceberg
בדוגמה הבאה מוצגת שאילתה מתמשכת שמסננת וממירה נתונים מטבלה ב-BigQuery שמקבלת מידע בסטרימינג על נסיעות במונית, ואז כותבת את הנתונים בטבלה אחרת ב-BigQuery או בטבלה מנוהלת ב-Iceberg בזמן אמת. כך הנתונים זמינים לניתוח נוסף בהמשך ב-BigQuery או ב-Lakehouse בפורמט פתוח.
INSERT INTO `myproject.real_time_taxi_streaming.transformed_taxirides` SELECT timestamp, meter_reading, ride_status, passenger_count, ST_Distance( ST_GeogPoint(pickup_longitude, pickup_latitude), ST_GeogPoint(dropoff_longitude, dropoff_latitude)) AS euclidean_trip_distance, SAFE_DIVIDE(meter_reading, passenger_count) AS cost_per_passenger FROM APPENDS(TABLE `myproject.real_time_taxi_streaming.taxirides`, -- Configure the APPENDS TVF start_timestamp to specify when you want to -- start processing data using your continuous query. -- This example starts processing at 10 minutes before the current time. CURRENT_TIMESTAMP() - INTERVAL 10 MINUTE) WHERE ride_status = 'dropoff';
כדי לכתוב פלט של שאילתה מתמשכת בטבלה מנוהלת של Iceberg, מחליפים את myproject.real_time_taxi_streaming.transformed_taxirides בשם של טבלת היעד המנוהלת של Iceberg.
התחביר זהה כי פרטי החיבור והגדרות האחסון ב-Lakehouse מוגדרים בטבלת היעד עצמה.
עיבוד נתונים באמצעות מודל של Gemini Enterprise Agent Platform
בדוגמה הבאה מוצגת שאילתה מתמשכת שמשתמשת במודל של פלטפורמת הסוכנים כדי ליצור מודעה לנוסעים במונית על סמך קו הרוחב וקו האורך הנוכחיים שלהם, ואז מייצאת את התוצאות לנושא Pub/Sub בזמן אמת:
EXPORT DATA OPTIONS ( format = 'CLOUD_PUBSUB', uri = 'https://pubsub.googleapis.com/projects/myproject/topics/taxi-real-time-rides') AS ( SELECT TO_JSON_STRING( STRUCT( ride_id, timestamp, latitude, longitude, prompt, result)) AS message FROM AI.GENERATE_TEXT( MODEL `myproject.real_time_taxi_streaming.taxi_ml_generate_model`, ( SELECT timestamp, ride_id, latitude, longitude, CONCAT( 'Generate an ad based on the current latitude of ', latitude, ' and longitude of ', longitude) AS prompt FROM APPENDS(TABLE `myproject.real_time_taxi_streaming.taxirides`, -- Configure the APPENDS TVF start_timestamp to specify when you -- want to start processing data using your continuous query. -- This example starts processing at 10 minutes before the current time. CURRENT_TIMESTAMP() - INTERVAL 10 MINUTE) WHERE ride_status = 'enroute' ), STRUCT( 50 AS max_output_tokens, 1.0 AS temperature, 40 AS top_k, 1.0 AS top_p)) AS ml_output );
ביצוע צבירות של JOIN וחלונות
בדוגמה הבאה מוצגת שאילתה מתמשכת שמבצעת JOIN וצבירות בחלונות.
נניח שאתם רוצים לצרף טבלה של נסיעות במונית לטבלה של בקשות למונית, כדי להבין את מצב המוניות בכל שכונה כל חמש דקות. בעזרת פונקציות צבירה, אתם יכולים לתעד את נפח הביקוש למוניות בכל שכונה, ואת המרחק המינימלי, המקסימלי, הממוצע וסטיית התקן של הנוסע מהמונית כשהוא ביקש נסיעה.
INSERT INTO `real_time_taxi_streaming.neighborhood_taxi_health` WITH potential_matches AS ( SELECT requests._CHANGE_TIMESTAMP AS bq_changed_ts, requests.geohash, requests.latitude, requests.longitude, ST_DISTANCE( ST_GEOGPOINT(requests.longitude, requests.latitude), ST_GEOGPOINT(taxis.longitude, taxis.latitude) ) AS distance_in_meters FROM APPENDS(TABLE `real_time_taxi_streaming.ride_requests`, CURRENT_TIMESTAMP() - INTERVAL 10 MINUTE) AS requests INNER JOIN APPENDS(TABLE `real_time_taxi_streaming.taxirides`, CURRENT_TIMESTAMP() - INTERVAL 10 MINUTE) AS taxis ON requests.geohash = taxis.geohash WHERE taxis.ride_status = 'available' AND taxis._CHANGE_TIMESTAMP BETWEEN (requests._CHANGE_TIMESTAMP - INTERVAL 5 MINUTE) AND requests._CHANGE_TIMESTAMP AND ST_Dwithin( ST_GEOGPOINT(requests.longitude, requests.latitude), ST_GEOGPOINT(taxis.longitude, taxis.latitude), 2000 -- Distance in meters ) ) SELECT window_end, geohash, ROUND(AVG(latitude), 6) AS avg_latitude, ROUND(AVG(longitude), 6) AS avg_longitude, COUNT(*) AS taxi_demand_volume, ROUND(AVG(distance_in_meters), 2) AS avg_proximity_meters, ROUND(MIN(distance_in_meters), 2) AS min_proximity_meters, ROUND(MAX(distance_in_meters), 2) AS max_proximity_meters, ROUND(STDDEV(distance_in_meters), 2) AS proximity_stddev FROM TUMBLE(TABLE potential_matches, "bq_changed_ts", INTERVAL 5 MINUTE) GROUP BY window_end, geohash;
שינוי ה-SQL של שאילתה מתמשכת
אי אפשר לעדכן את ה-SQL שמשמש בשאילתה מתמשכת בזמן שמשימת השאילתה המתמשכת פועלת. צריך לבטל את משימת השאילתה המתמשכת, לשנות את ה-SQL ואז להתחיל משימת שאילתה מתמשכת חדשה מהנקודה שבה עצרתם את משימת השאילתה המתמשכת המקורית.
כדי לשנות את ה-SQL שמשמש בשאילתה מתמשכת:
- מציגים את פרטי המשימה של השאילתה המתמשכת שרוצים לעדכן, ורושמים את מזהה המשימה.
- אם אפשר, השהו את איסוף הנתונים במעלה הזרם. אם לא תעשו זאת, יכול להיות שחלק מהנתונים ישוכפלו כשהשאילתה המתמשכת תופעל מחדש.
- מבטלים את השאילתה המתמשכת שרוצים לשנות.
משיגים את הערך של
end_timeלמשימת השאילתה המתמשכת המקורית באמצעותINFORMATION_SCHEMAJOBSview:SELECT end_time FROM `PROJECT_ID.region-REGION`.INFORMATION_SCHEMA.JOBS_BY_PROJECT WHERE EXTRACT(DATE FROM creation_time) = current_date() AND error_result.reason = 'stopped' AND job_id = 'JOB_ID';
מחליפים את מה שכתוב בשדות הבאים:
PROJECT_ID: מזהה הפרויקט.-
REGION: האזור שבו משתמשים בפרויקט. -
JOB_ID: מזהה המשימה של השאילתה המתמשכת שזיהיתם בשלב 1.
משנים את הצהרת ה-SQL של השאילתה המתמשכת כדי להתחיל את השאילתה המתמשכת מנקודת זמן מסוימת, ומשתמשים בערך
end_timeשקיבלתם בשלב 5 כנקודת ההתחלה.משנים את הצהרת ה-SQL של השאילתה המתמשכת בהתאם לשינויים שרוצים לבצע.
מריצים את השאילתה המתמשכת ששיניתם.
ביטול שאילתה מתמשכת
אפשר לבטל משימת שאילתה מתמשכת כמו כל משימה אחרת. יכול להיות שיעבור עד דקה עד שהשאילתה תפסיק לפעול אחרי שהמשימה תבוטל.
אם מבטלים שאילתה ואז מפעילים אותה מחדש, השאילתה שהופעלה מחדש מתנהגת כמו שאילתה חדשה ועצמאית. השאילתה שהופעלה מחדש לא מתחילה לעבד נתונים מהנקודה שבה המשימה הקודמת נעצרה, והיא לא יכולה להפנות לתוצאות של השאילתה הקודמת. איך מפעילים שאילתה מתמשכת מנקודת זמן מסוימת
מעקב אחרי שאילתות וטיפול בשגיאות
שאילתה מתמשכת עלולה להיקטע בגלל גורמים כמו חוסר עקביות בנתונים, שינויים בסכימה, שיבושים זמניים בשירות או תחזוקה. למרות ש-BigQuery מטפל בחלק מהשגיאות הזמניות, השיטות המומלצות הבאות יעזרו לכם לשפר את העמידות של המשימות: