שימוש
explore: explore_name {
join: view_name { ... }
}
|
היררכיה
join |
ערך ברירת המחדל
ללא
אמצעי תשלום מקובלים
השם של תצוגה קיימת
כללים מיוחדים
|
הגדרה
הפרמטר join מאפשר להגדיר את קשר הצירוף בין Explore לבין תצוגה, כדי שתוכלו לשלב נתונים מכמה תצוגות. אפשר להצטרף לכמה תצוגות שרוצים בכל חקירה נתונה.
זכרו שכל תצוגה משויכת לטבלה במסד הנתונים, או לטבלה נגזרת שהגדרתם ב-Looker. באופן דומה, מכיוון ש-Explore משויך לתצוגה, הוא גם מחובר לטבלה מסוג כלשהו.
הטבלה שמשויכת ל-Explore ממוקמת בסעיף FROM של ה-SQL שנוצר על ידי Looker. טבלאות שמשויכות לתצוגות מאוחדות ממוקמות בסעיף JOIN של ה-SQL שנוצר על ידי Looker.
פרמטרים עיקריים של איחוד (join)
כדי להגדיר את קשר הצירוף (הפסוקית ON ב-SQL) בין חקירה לבין תצוגה, צריך להשתמש ב-join בשילוב עם פרמטרים אחרים.
כדי להגדיר את הסעיף ON ב-SQL, צריך להשתמש בפרמטר sql_on או בפרמטר foreign_key.
אתם גם צריכים לוודא שאתם משתמשים בסוגי הצירופים והקשרים המתאימים, למרות שהפרמטרים type ו-relationship לא תמיד נדרשים באופן מפורש. אם ערכי ברירת המחדל שלהם, type: left_outer ו-relationship: many_to_one, מתאימים לתרחיש לדוגמה שלכם, אפשר להחריג את הפרמטרים האלה.
אפשר לסכם את הפרמטרים העיקריים האלה ואת הקשר שלהם ל-SQL ש-Looker יוצר באופן הבא:
- הפרמטר
exploreקובע את הטבלה בסעיףFROMשל שאילתת ה-SQL שנוצרה. - כל פרמטר
joinקובע פסוקיתJOINשל שאילתת ה-SQL שנוצרת.- הפרמטר
typeקובע את סוג ה-SQL join. - הפרמטר
sql_onוהפרמטרforeign_keyקובעים את הסעיףONשל שאילתת ה-SQL שנוצרה.
- הפרמטר
sql_on
sql_on מאפשר לכם ליצור קשר של איחוד (join) על ידי כתיבת משפט ה-SQL ON ישירות. היא יכולה לבצע את אותם איחודים כמו foreign_key, אבל קל יותר לקרוא ולהבין אותה.
מידע נוסף זמין בדף התיעוד של הפרמטר sql_on.
foreign_key
foreign_key מאפשר ליצור קשר של צירוף באמצעות המפתח הראשי של התצוגה המצורפת, ולקשר אותו למאפיין ב-Explore. התבנית הזו נפוצה מאוד בעיצוב מסדי נתונים, ו-foreign_key היא דרך אלגנטית לבטא את הצירוף במקרים האלה.
כדי להבין את הנושא לעומק, כדאי לעיין בדף העזרה בנושא הפרמטר foreign_key.
type
רוב הצירופים ב-Looker הם LEFT JOIN מהסיבות שמתוארות בקטע אם אפשר, לא כדאי להחיל לוגיקה עסקית בצירופים בדף הזה. לכן, אם לא מוסיפים באופן מפורש type, המערכת של Looker תניח שאתם רוצים LEFT JOIN. עם זאת, אם מסיבה כלשהי אתם צריכים סוג אחר של צירוף, אתם יכולים לעשות זאת באמצעות type.
הסבר מלא זמין בדף העזרה בנושא הפרמטר type.
relationship
ל-relationship אין השפעה ישירה על ה-SQL ש-Looker יוצר, אבל הוא קריטי לפעולה התקינה של Looker. אם לא מוסיפים relationship באופן מפורש, Looker יפרש את הקשר כ-many-to-one, כלומר, להרבה שורות ב-Explore יכולה להיות שורה אחת בתצוגה המצורפת. לא כל הצירופים הם מהסוג הזה, וצריך להצהיר בצורה נכונה על צירופים עם קשרים אחרים.
כדי להבין את הנושא לעומק, כדאי לעיין בדף העזרה בנושא הפרמטר relationship.
דוגמאות
צירוף התצוגה בשם customer ל-Explore בשם order, כאשר קשר הצירוף הוא
FROM order LEFT JOIN customer ON order.customer_id = customer.id:
explore: order {
join: customer {
foreign_key: customer_id
relationship: many_to_one # Could be excluded since many_to_one is the default
type: left_outer # Could be excluded since left_outer is the default
}
}
מצרפים את התצוגה בשם address ל-Explore בשם person, כאשר קשר הצירוף הוא
FROM person LEFT JOIN address ON person.id = address.person_id
AND address.type = 'permanent':
explore: person {
join: address {
sql_on: ${person.id} = ${address.person_id} AND ${address.type} = 'permanent' ;;
relationship: one_to_many
type: left_outer # Could be excluded since left_outer is the default
}
}
צירוף התצוגה בשם member ל-Explore בשם event, כאשר קשר הצירוף הוא
FROM event INNER JOIN member ON member.id = event.member_id:
explore: event {
join: member {
sql_on: ${event.member_id} = ${member.id} ;;
relationship: many_to_one # Could be excluded since many_to_one is the default
type: inner
}
}
אתגרים נפוצים
השדה join חייב להשתמש בשמות של תצוגות ולא בשמות של טבלאות בסיסיות
הפרמטר join מקבל רק שם של תצוגה, ולא את שם הטבלה שמשויכת לתצוגה הזו. הרבה פעמים שם התצוגה ושם הטבלה זהים, וזה עלול להוביל למסקנה השגויה שאפשר להשתמש בשמות של טבלאות.
סוגים מסוימים של מדדים דורשים צבירה סימטרית
אם אתם לא משתמשים בצבירה סימטרית, רוב סוגי המדדים לא נכללים בתצוגות המצורפות. כדי ש-Looker יתמוך בצבירה סימטרית בפרויקט Looker, גם הניב של מסד הנתונים צריך לתמוך בה. בטבלה הבאה מפורט אילו ניבים תומכים בצבירה סימטרית בגרסה האחרונה של Looker:
| ניב | יש תמיכה? |
|---|---|
| Actian Avalanche | |
| Amazon Athena | |
| Amazon Aurora MySQL | |
| Amazon Redshift | |
| Amazon Redshift 2.1+ | |
| Amazon Redshift Serverless 2.1+ | |
| Apache Druid | |
| Apache Druid 0.13.x - 0.17.x | |
| Apache Druid 0.18+ | |
| Apache Hive 2.3+ | |
| Apache Hive 3.1.2+ | |
| Apache Spark 3+ | |
| ClickHouse | |
| ClickHouse 26+ | |
| Cloudera Impala 3.1+ | |
| Cloudera Impala 3.1+ with Native Driver | |
| Cloudera Impala with Native Driver | |
| DataVirtuality | |
| Databricks | |
| Denodo 7 | |
| Denodo 8 & 9 | |
| Dremio | |
| Dremio 11+ | |
| Dremio 26+ with Arrow Flight SQL | |
| Exasol | |
| Google BigQuery Legacy SQL | |
| Google BigQuery Standard SQL | |
| Google Cloud AlloyDB for PostgreSQL | |
| Google Cloud PostgreSQL | |
| Google Cloud SQL | |
| Google Spanner | |
| Greenplum | |
| HyperSQL | |
| IBM Netezza | |
| MariaDB | |
| Microsoft Azure PostgreSQL | |
| Microsoft Azure SQL Database | |
| Microsoft Azure Synapse Analytics | |
| Microsoft SQL Server 2008+ | |
| Microsoft SQL Server 2012+ | |
| Microsoft SQL Server 2016 | |
| Microsoft SQL Server 2017+ | |
| MongoBI | |
| MongoSQL | |
| MySQL | |
| MySQL 8.0.12+ | |
| Oracle | |
| Oracle ADWC | |
| PostgreSQL 9.5+ | |
| PostgreSQL pre-9.5 | |
| PrestoDB | |
| PrestoSQL | |
| SAP HANA | |
| SAP HANA 2+ | |
| SingleStore | |
| SingleStore 7+ | |
| Snowflake | |
| Teradata | |
| Trino | |
| Vector | |
| Vertica |
בלי צבירה סימטרית, קשרי גומלין של צירוף שהם לא אחד לאחד יכולים ליצור תוצאות לא מדויקות בפונקציות צבירה. מאחר שהמדדים של Looker הם פונקציות נצברות, רק מדדים של type: count (כמו COUNT DISTINCT) מועברים מתצוגות מצורפות אל ה-Explore. אם יש לכם קשר של אחד לאחד, אתם יכולים להשתמש בפרמטר relationship כדי לאלץ את הכללת סוגי המדדים האחרים, באופן הבא:
explore: person {
join: dna {
sql_on: ${person.dna_id} = ${dna.id} ;;
relationship: one_to_one
}
}
הסיבות לכך ש-Looker פועל בצורה הזו (בניבים שלא תומכים בצבירה סימטרית) מפורטות בפוסט לקהילה בנושא הבעיה של פיצול SQL.
חשוב לדעת
אפשר להצטרף לאותו שולחן יותר מפעם אחת באמצעות from
במקרים שבהם טבלה אחת מכילה סוגים שונים של ישויות, אפשר לצרף תצוגה לעולם תוכן מורחב יותר מפעם אחת. כדי לעשות את זה, צריך להשתמש בפרמטר from. נניח שיש לכם order Explore ואתם צריכים לצרף אליו תצוגה של person פעמיים: פעם אחת בשביל הלקוח ופעם אחת בשביל נציג שירות הלקוחות. לדוגמה:
explore: order {
join: customer {
from: person
sql_on: ${order.customer_id} = ${customer.id} ;;
}
join: representative {
from: person
sql_on: ${order.representative_id} = ${representative.id} ;;
}
}
אם אפשר, לא להחיל לוגיקה עסקית על צירופים
הגישה הרגילה של Looker לצירוף היא להשתמש ב-LEFT JOIN בכל פעם שאפשר. אם אתם מוצאים את עצמכם עושים משהו דומה, כדאי לשקול גישה אחרת:
explore: member_event {
from: event
always_join: [member]
join: member {
sql_on: ${member_event.member_id} = ${member.id} ;;
type: inner
}
}
בדוגמה הזו יצרנו ניתוח שמתייחס רק לאירועים שמשויכים לחברים מוכרים. עם זאת, הדרך המועדפת לבצע את זה ב-Looker היא להשתמש ב-LEFT JOIN כדי לחבר בין נתוני האירועים לנתוני החברים, כך:
explore: event {
join: member {
sql_on: ${event.member_id} = ${member.id} ;;
}
}
אחר כך יוצרים מאפיין שאפשר להגדיר כ-yes או כ-no, אם רוצים לבחון רק אירועים של חברים, למשל:
dimension: is_member_event {
type: yesno
sql: ${member.id} IS NOT NULL ;;
}
הגישה הזו עדיפה כי היא נותנת למשתמשים את הגמישות להסתכל על כל האירועים או רק על אירועים של חברים, לפי מה שהם רוצים. לא אילצתם אותם לצפות רק באירועים של חברי המועדון באמצעות ההצטרפות.
אם לא משתמשים בצבירה סימטרית, כדאי להימנע מצירופים שגורמים ל-fanout
הקטע הזה רלוונטי רק לניבים של מסדי נתונים שלא תומכים בצבירה סימטרית. כדי לבדוק אם הניב תומך בצבירה סימטרית, עיינו בדיון על צבירה סימטרית בקטע אתגרים נפוצים בדף הזה.
אם הדיאלקט של מסד הנתונים לא תומך בצבירה סימטרית, כדאי להימנע משאילתות JOIN שגורמות ל-fanout. במילים אחרות, בדרך כלל כדאי להימנע מצירופים שיש להם קשר של אחד לרבים בין ה-Explore לתצוגה. במקום זאת, צריך לצבור את הנתונים מהתצוגה בטבלה נגזרת כדי ליצור קשר של אחד לאחד עם ה-Explore, ואז לצרף את הטבלה הנגזרת ל-Explore.
המושג החשוב הזה מוסבר בהרחבה בפוסט לקהילה The problem of SQL fanouts.