שימוש בשאילתות איחוד (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, צריך לשמור יותר מצבים, מה שמוביל לניצול גבוה יותר של חריצי זמן.

המאמרים הבאים