הסבר על צבירה של חלונות בזמן אמת בשאילתות רציפות
כדי לבקש תמיכה או לשלוח משוב על התכונה הזו, אפשר לשלוח אימייל לכתובת bq-continuous-queries-feedback@google.com.
שאילתות רציפות ב-BigQuery תומכות בצבירה ובחלוקה לחלונות כפעולות עם שמירת מצב. פעולות עם שמירת מצב מאפשרות לביצוע שאילתות רציפות ניתוח מורכב שדורש שמירת מידע בכמה שורות או מרווחי זמן. היכולת הזו מאפשרת לכם לחשב מדדים לאורך זמן – כמו ממוצע של 30 דקות – על ידי אחסון הנתונים הדרושים בזיכרון בזמן שהשאילתה פועלת.
פונקציות חלון מקצות נתונים לרכיבים לוגיים, או חלונות, על סמך זמן המערכת, שמציין את זמן השמירה של העסקה שגרמה לשינוי. ב-BigQuery, הפונקציות האלה הן פונקציות שמחזירות טבלה (TVF) שמכילה את כל העמודות המקוריות ושתי עמודות נוספות: window_start ו-window_end. בעמודות האלה מצוין מרווח הזמן של כל חלון. מידע נוסף על פעולות עם שמירת מצב זמין במאמר בנושא פעולות נתמכות עם שמירת מצב.
פונקציות TVF של חלונות נתמכות רק בשאילתות רציפות של BigQuery.
פונקציות TVF של חלונות שונות מקריאות לפונקציות אנליטיות.
פונקציות צבירה נתמכות
הפונקציות הבאות של צבירה נתמכות:
ANY_VALUEAPPROX_COUNT_DISTINCTAPPROX_QUANTILESAPPROX_TOP_COUNTAPPROX_TOP_SUMARRAY_AGGעם הדרישות הבאות:- חובה לציין סעיף
LIMIT, עם ערך מקסימלי של 100. - הסעיף
ORDER BYהוא אופציונלי.
- חובה לציין סעיף
ARRAY_CONCAT_AGGAVGBIT_ANDBIT_ORBIT_XORCORRCOUNTCOUNTIFCOVAR_POPCOVAR_SAMPLOGICAL_ANDLOGICAL_ORMAXMAX_BYMINMIN_BYSTDDEVSTDDEV_POPSTDDEV_SAMPSTRING_AGGעם הדרישות הבאות:- חובה לציין סעיף
LIMIT, עם ערך מקסימלי של 100. - הסעיף
ORDER BYהוא אופציונלי.
- חובה לציין סעיף
SUMVAR_POPVAR_SAMPVARIANCE
פונקציות צבירה שלא נתמכות
פונקציות הצבירה הבאות לא נתמכות:
AVG(פרטיות דיפרנציאלית)COUNT(פרטיות דיפרנציאלית)- פונקציות שמכילות ביטויי
DISTINCT. GROUPINGPERCENTILE_CONT(פרטיות דיפרנציאלית)ST_CENTROID_AGGST_EXTENTST_UNION_AGGSUM(פרטיות דיפרנציאלית)
הפונקציה TUMBLE
הפונקציה TUMBLE מקצה נתונים למרווחי זמן לא חופפים (חלונות מתגלגלים) בגודל שצוין. לדוגמה, חלון של 5 דקות מקבץ אירועים במרווחי זמן נפרדים כמו [2026-01-01 12:00:00, 2026-01-01 12:05:00) ו-[2026-01-01 12:05:00, 2026-01-01 12:10:00). שורה עם ערך חותמת זמן
2026-01-01 12:03:18 משויכת לחלון הראשון. חלונות הזמן האלה נפרדים ולא חופפים, ולכן כל רכיב עם חותמת זמן משויך לחלון זמן אחד בלבד.
בתרשים הבא מוצג איך הפונקציה TUMBLE מקצה אירועים למרווחי זמן לא חופפים:
אפשר להשתמש בפונקציה הזו בעיבוד אירועים בזמן אמת כדי לקבץ אירועים לפי טווחי זמן לפני שמבצעים צבירה.
תחביר
TUMBLE(TABLE table, "timestamp_column", window_size)
הגדרות
table: שם הטבלה ב-BigQuery. הערך הזה חייב להיות טבלה ב-BigQuery רגילה שמוקפת בפונקציהAPPENDS. המילהTABLEחייבת להופיע לפני הארגומנט הזה.
timestamp_column: מחרוזתSTRINGמילולית שמציינת את שם העמודה בטבלת הקלט שמכילה את שעת האירוע. הערכים בעמודה הזו מקצים כל שורה לחלון. העמודה_CHANGE_TIMESTAMP, שמגדירה את זמן המערכת ב-BigQuery, היא העמודה היחידה שנתמכת ב-timestamp_column. אין תמיכה בעמודות שהוגדרו על ידי המשתמש.window_size: ערךINTERVALשמגדיר את משך הזמן של כל חלון עוקב. הגודל המקסימלי של חלון הוא 24 שעות. לדוגמה:INTERVAL 30 SECOND.
תשובה
הפונקציה TUMBLE מחזירה פלט עם העמודות הבאות:
כל העמודות של טבלת הקלט בזמן הפעלת השאילתה.
window_start: ערךTIMESTAMPשמציין את שעת ההתחלה כולל של חלון הזמן שאליו הרשומה משתייכת.
window_end: ערךTIMESTAMPשמציין את שעת הסיום הבלעדית של חלון הזמן שאליו משתייכת הרשומה.
יצירת חומרים בפלט
בשאילתה מתמשכת של BigQuery, צבירה עם חלון לא יוצרת פלט עבור מרווח זמן ספציפי עד ש-BigQuery מסיימת או סוגרת את החלון הזה. ההתנהגות הזו מבטיחה ש-BigQuery יפלט את התוצאות המצטברות רק אחרי שהוא יעבד את כל הנתונים הרלוונטיים לחלון הזמן הזה.
לדוגמה, אם מבצעים צבירה של חלון של 5 דקות בטבלה TUMBLEuser_clickstream, התוצאות של המרווח [10:15; 10:20) מופקות רק אחרי שהשאילתה מעבדת רשומות עם _CHANGE_TIMESTAMP של 10:20 או מאוחר יותר. באותו רגע, BigQuery מחשיב את החלון כסגור.
בנוסף, נפתח חלון ומתחיל לצבור נתונים ברגע שמופיעה הרשומה הראשונה ששייכת לטווח הזמן הספציפי הזה.
בזמן שחלון נשאר פתוח, BigQuery צריך לשמור את תוצאות הצבירה הביניים. כדי לעשות את זה, צריך לשמור את המצב, כלומר BigQuery צריך לשמור את תוצאות הצבירה הביניים. מכיוון שהמצב הזה צריך להישאר בזיכרון הפעיל עד שהחלון נסגר, שימוש במשכי חלון ארוכים יותר או עיבוד של זרמים בנפח גבוה מוביל לניצול גבוה יותר של משבצות כדי לנהל את הכמות הגדולה יותר של ההקשר המאוחסן. מידע נוסף מופיע במאמר בנושא שיקולי תמחור.
מגבלות
- הפונקציה
TUMBLEנתמכת רק בשאילתות רציפות של BigQuery. - כשמתחילים שאילתה מתמשכת עם הפונקציה
TUMBLE, אפשר להשתמש רק בפונקציהAPPENDS. הפונקציהCHANGESלא נתמכת. - עמודת הזמן של מערכת BigQuery שמוגדרת על ידי
_CHANGE_TIMESTAMPהיאtimestamp_columnהיחידה שנתמכת. אין תמיכה בעמודות שהוגדרו על ידי המשתמש. - הגודל המקסימלי של חלון הוא 24 שעות.
- כשמריצים את פונקציית החלונות
TUMBLE, נוצרות שתי עמודות פלט נוספות:window_startו-window_end. צריך לכלול לפחות אחת מהעמודות האלה בהצהרתGROUP BYבתוך הצהרתSELECTשמבצעת את צבירת החלונות. - כשמשתמשים בפונקציה
TUMBLEעם צירופי שאילתות מתמשכות, צריך לפעול בהתאם לכל המגבלות של צירופי שאילתות מתמשכות.
שיקולי תמחור
החיוב על שאילתות רציפות ב-BigQuery מבוסס על קיבולת החישוב (יחידות קיבולת) שנצרכה בזמן שהמשימה פועלת. המודל הזה של מדידת מכסות שימוש לפי כוח חישוב רלוונטי גם לפעולות עם שמירת מצב, כמו חלונות. מכיוון שחלוקת חלונות מחייבת את BigQuery לאחסן 'מצב' בזמן שהשאילתה פעילה, היא צורכת משאבי משבצות נוספים. באופן כללי, ככל שיש יותר הקשר או נתונים שמאוחסנים בחלון זמן – למשל כשמשתמשים במשכי חלון זמן ארוכים יותר – כך BigQuery צריך לשמור יותר מצב. כך ניתן להשתמש ביותר משבצות זמן.
דוגמאות
השאילתה הבאה מראה איך לשלוח שאילתה לטבלה של נסיעות במונית כדי לקבל את המספר הממוצע של נסיעות, מספר הנוסעים והתעריף הממוצע לכל מונית כל 30 דקות, ולייצא את הנתונים האלה לטבלה ב-BigQuery:
INSERT INTO
`real_time_taxi_streaming.driver_stats`
WITH ride_completions AS (
SELECT
_CHANGE_TIMESTAMP as bq_changed_ts,
CAST(timestamp AS DATE) AS ride_date,
taxi_id,
meter_reading,
passenger_count
FROM
APPENDS(TABLE `real_time_taxi_streaming.taxirides`,
CURRENT_TIMESTAMP() - INTERVAL 10 MINUTE)
WHERE
ride_status = 'dropoff')
SELECT
ride_date,
window_end,
taxi_id,
COUNT(taxi_id) AS total_rides_per_half_hour,
ROUND(AVG(meter_reading),2) AS avg_fare_per_half_hour,
SUM(passenger_count) AS total_passengers_per_half_hour
FROM
tumble(TABLE ride_completions,"bq_changed_ts",INTERVAL 30 MINUTE)
GROUP BY
window_end,
ride_date,
taxi_id