שימוש בשאילתות איחוד (join) של נתונים בזמן אמת בשאילתות רציפות
ב-BigQuery, אפשר להשתמש בצירופים של נתונים ממקורות שונים בשאילתות רציפות כדי לנתח נתונים משני מקורות נתונים או יותר בזמן אמת ולמצוא קשרים ביניהם. צירופים של נתונים ממקורות שונים הם פעולת צירוף בין שתי טבלאות או יותר שמקבלות נתונים שמוזנים לפי זמן.
תרחישים נפוצים לשימוש בצירופים של עדכוני תוכן כוללים זיהוי הונאות פיננסיות, בניית פרופילים של לקוחות ואופטימיזציה של ניהול שרשרת האספקה. הפעולות האלה הן סוג חשוב של פעולות עם שמירת מצב. מידע נוסף על פעולות עם שמירת מצב זמין במאמר פעולות נתמכות עם שמירת מצב.
סוגי JOIN נתמכים
הסוגים הבאים של JOIN נתמכים בשאילתות רציפות:
- JOIN מזרם לזרם – פעולת צירוף בין שתי טבלאות או יותר שמקבלות נתונים שמוזנים לפי זמן.
- INNER JOIN.
סוגי JOIN שלא נתמכים
סוגי ה-JOIN הבאים לא נתמכים בשאילתות רציפות:
- צירופים של טבלאות סטטיות וטבלאות של נתונים בזמן אמת – צירוף שבו לפחות אחת מהטבלאות המצורפות היא טבלה סטטית שלא מתבצעת בה הטמעה של נתונים שקשורים לזמן. דוגמה לטבלה סטטית היא טבלת מאפיינים.
- סוגים אחרים של פעולות JOIN חוץ מ-
INNER. - הוראות JOIN שלא כוללות פסוקיות JOIN שקשורות לזמן.
שילוב נתונים מכמה מקורות נתונים
השאילתה הבאה מראה איך לצרף טבלה של נסיעות במונית לטבלה של בקשות למונית, לזהות את המונית הזמינה הקרובה ביותר למי ששלח את הבקשה בטווח של 5 דקות, ולייצא את הנתונים האלה לטבלה אחרת ב-BigQuery:
INSERT INTO
`real_time_taxi_streaming.matched_rides`
SELECT
requests.timestamp AS request_time,
requests.request_id,
taxis.taxi_id,
ST_DISTANCE(
ST_GEOGPOINT(requests.longitude, requests.latitude),
ST_GEOGPOINT(taxis.longitude, taxis.latitude)
) AS distance_in_meters,
taxis.timestamp AS taxi_available_time
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
);
שיקולים להצטרפות
בקטעים הבאים מפורטים השיקולים שצריך לקחת בחשבון כשמבצעים הצטרפות של זרם לזרם.
מגבלות
- יש תמיכה רק בפעולות
INNER JOIN. אין תמיכה בטפסים אחרים, כמוLEFTאוFULL OUTER. - בכל צד של הפעולה
INNER JOINצריך לציין שעת התחלה לשאילתה מתמשכת. - בנוסף למפתח צירוף (לדוגמה,
table1.user_id = table2.user_id), הפסוקיתJOINחייבת לכלול תנאי להגבלת עמודת חותמת הזמן למרווח קבוע. התנאי הזה מגביל את משך הזמן שמערכת ממתינה להגעת אירוע תואם בזרם השני. לדוגמה, אפשר לציין שאירוע מזרם אחד יכול להיות מצורף לאירוע מזרם אחר רק אם חותמות הזמן שלהם נמצאות במרווח של 5 דקות. אין הגבלה על מרווחים סימטריים. לדוגמה, אפשר להשתמש במרווח של 5 דקות בצד אחד של תנאי הצירוף ובמרווח של שעה בצד השני. - כשמתחילים שאילתה רציפה עם הצטרפות של זרם לזרם, יש תמיכה רק בפונקציה
APPENDS. אין תמיכה בפונקציהCHANGES. - עמודת חותמת הזמן היחידה שנתמכת בפעולות של צירוף היא עמודת הזמן של מערכת BigQuery, שמוגדרת על ידי
_CHANGE_TIMESTAMP. עמודות שמוגדרות על ידי המשתמש לא נתמכות. - כשמשתמשים בהגדרה הזו בשילוב עם צבירות בחלון זמן, צריך לפעול בהתאם לכל המגבלות המתועדות של צבירות בחלון זמן.
שיקולי תמחור
החיוב על שאילתות רציפות ב-BigQuery מבוסס על קיבולת החישוב (משבצות) שנצרכת בזמן שהעבודה פועלת. המודל הזה שמבוסס על חישוב חל גם על פעולות עם שמירת מצב, כמו צירופים. מכיוון שצירופים מחייבים את המערכת לשמור 'מצב' בזמן שהשאילתה פעילה, הם צורכים משאבי משבצות נוספים. יותר הקשר או נתונים שנשמרים בצירוף – למשל, כשמשתמשים במרווחי זמן ארוכים יותר בפסקה JOIN או WHERE – מחייבים שמירה של יותר מצב, מה שמוביל לניצול גבוה יותר של משבצות.
המאמרים הבאים
- מידע נוסף על שאילתות רציפות ב-BigQuery
- איך משתמשים בצבירה של חלונות
- איך מבצעים פעולות JOIN, צבירה וחלוקה לחלונות