שימוש בשאילתות איחוד (join) בין מקורות נתונים בשאילתות מתמשכות
ב-BigQuery, אתם יכולים להשתמש בצירופים של סטרימינג לסטרימינג בשאילתות מתמשכות כדי לנתח נתונים משני מקורות נתונים בזמן אמת או יותר, ולמצוא קשרים ביניהם. פעולת איחוד בין מקורות נתונים היא פעולת איחוד בין שתי טבלאות או יותר שמקבלות הטמעת נתונים לפי זמן.
תרחישים נפוצים לשימוש באיחודים בין מקורות נתונים כוללים זיהוי הונאות פיננסיות, יצירת פרופילים של לקוחות ואופטימיזציה של ניהול שרשרת האספקה. האיחודים האלה הם סוג מרכזי של פעולה עם שמירת מצב. מידע נוסף על פעולות עם שמירת מצב זמין במאמר פעולות נתמכות עם שמירת מצב.
סוגי JOIN נתמכים
אלה סוגי ה-JOIN שנתמכים בשאילתות מתמשכות:
- Stream-to-stream JOIN – פעולת איחוד בין שתי טבלאות או יותר שמקבלות הטמעת נתונים לפי זמן.
- INNER JOIN.
סוגי JOIN לא נתמכים
סוגי ה-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 מבוסס על יכולת המחשוב (משבצות) שנצרכה בזמן שהמשימה רצה. המודל הזה, שמבוסס על מחשוב, חל גם על פעולות עם שמירת מצב (stateful) כמו צירופים. מכיוון שפעולות JOIN מחייבות את המערכת לאחסן "מצב" בזמן שהשאילתה פעילה, הן צורכות משאבי חריצים נוספים. ככל שיש יותר הקשר או נתונים שמאוחסנים ב-join, למשל כשמשתמשים במרווחי זמן ארוכים יותר בסעיף JOIN או WHERE, צריך לשמור יותר מצבים, מה שמוביל לניצול גבוה יותר של חריצי זמן.