ב-Looker, טבלאות נגזרות מתמידות (PDT) נכתבות לסכימת ה-scratch של מסד הנתונים. Looker שומר ובונה מחדש PDT על סמך אסטרטגיית השמירה שלו. כשמפעילים PDT כדי לבנות מחדש, כברירת מחדל Looker בונה מחדש את כל הטבלה.
PDT מצטבר הוא PDT ש-Looker בונה על ידי הוספת נתונים חדשים לטבלה במקום לבנות מחדש את הטבלה כולה:

אם הניב שלכם תומך ב-PDT מצטבר, אתם יכולים להפוך את סוגי ה-PDT הבאים ל-PDT מצטבר:
- טבלאות מצטברות
- טבלאות PDT מבוססות LookML (מקורי)
- PDT שמבוססות על SQL
בפעם הראשונה שמריצים שאילתה ב-PDT מצטבר, Looker בונה את ה-PDT כולו כדי לקבל את הנתונים הראשוניים. אם הטבלה גדולה, יכול להיות שהבנייה הראשונית תימשך זמן רב, כמו כל בנייה של טבלה גדולה. אחרי שהטבלה הראשונית נוצרת, אם ה-PDT המצטבר מוגדר בצורה אסטרטגית, יצירות נוספות יהיו מצטברות וידרשו פחות זמן.
הערות לגבי כללי PDT מצטברים:
- מערכת Looker תומכת ב-PDT מצטבר רק אם ה-PDT משתמש באסטרטגיית שמירה מבוססת-טריגר (
datagroup_trigger,sql_trigger_valueאוinterval_trigger). מערכת Looker לא תומכת ב-PDT מצטבר אם ה-PDT משתמש באסטרטגיית השמירהpersist_for. - ב-PDT מבוסס SQL, צריך להגדיר את שאילתת הטבלה באמצעות הפרמטר
sqlכדי להשתמש בה כ-PDT מצטבר. אי אפשר לבצע בנייה מצטברת של טבלאות PDT שמבוססות על SQL ומוגדרות באמצעות הפרמטרsql_createאו הפרמטרcreate_process. כפי שאפשר לראות בדוגמה 1 בדף הזה, Looker משתמש בפקודה INSERT או בפקודה MERGE כדי ליצור את הגידולים ב-PDT מצטבר. אי אפשר להגדיר את הטבלה הנגזרת באמצעות הצהרות מותאמות אישית של שפת הגדרת נתונים (DDL), כי Looker לא יוכל לקבוע אילו הצהרות DDL נדרשות כדי ליצור תוספת מדויקת. - טבלת המקור של ה-PDT המצטבר צריכה להיות מותאמת לשאילתות שמבוססות על זמן. באופן ספציפי, לעמודה מבוססת-הזמן שמשמשת כמפתח מצטבר צריכה להיות מוגדרת אסטרטגיית אופטימיזציה, כמו חלוקה למחיצות, מפתחות מיון, אינדקסים או כל אסטרטגיית אופטימיזציה אחרת שנתמכת בניב שלכם. מומלץ מאוד לבצע אופטימיזציה של טבלת המקור, כי בכל פעם שהטבלה המצטברת מתעדכנת, Looker שולח שאילתה לטבלת המקור כדי לקבוע את הערכים העדכניים ביותר של העמודה שמבוססת על זמן ומשמשת כמפתח מצטבר. אם טבלת המקור לא מותאמת לשאילתות האלה, השאילתה של Looker לקבלת הערכים האחרונים עלולה להיות איטית ויקרה.
הגדרת PDT מצטבר
אפשר להשתמש בפרמטרים הבאים כדי להפוך PDT ל-PDT מצטבר:
-
increment_key(נדרש כדי להפוך את ה-PDT ל-PDT מצטבר): מגדיר את פרק הזמן שבו צריך לבצע שאילתות לגבי רשומות חדשות. {% incrementcondition %}מסנן Liquid (נדרש כדי להפוך PDT מבוסס-SQL ל-PDT מצטבר; לא רלוונטי ל-PDT מבוסס-LookML): מקשר את מפתח ההצטברות לעמודת הזמן במסד הנתונים שעליה מבוסס מפתח ההצטברות. מידע נוסף זמין בדף התיעוד שלincrement_key.-
increment_offset(אופציונלי): מספר שלם שמגדיר את מספר התקופות הקודמות (ברמת הגרנולריות של מפתח התוספת) שנבנות מחדש עבור כל בנייה מצטברת. הפרמטרincrement_offsetשימושי במקרים של נתונים שמגיעים באיחור, שבהם יכול להיות שבנתונים מתקופות זמן קודמות ייכללו נתונים חדשים שלא נכללו כשנוצר התוסף המתאים והתווסף ל-PDT.
בדף התיעוד של הפרמטר increment_key יש דוגמאות שמראות איך ליצור PDT מצטבר מטבלאות נגזרות מתמידות מבוססות LookML, מטבלאות נגזרות מתמידות שמבוססות על SQL ומטבלאות מצטברות.
זוהי דוגמה פשוטה לקובץ תצוגה שמגדיר PDT מצטבר מבוסס LookML:
view: flights_lookml_incremental_pdt {
derived_table: {
indexes: ["id"]
increment_key: "departure_date"
increment_offset: 3
datagroup_trigger: flights_default_datagroup
distribution_style: all
explore_source: flights {
column: id {}
column: carrier {}
column: departure_date {}
}
}
dimension: id {
type: number
}
dimension: carrier {
type: string
}
dimension: departure_date {
type: date
}
}
הטבלה הזו תיווצר במלואה בפעם הראשונה שתופעל עליה שאילתה. לאחר מכן, הטבלה תורכב מחדש במרווחים של יום אחד (increment_key: departure_date), ותחזור שלושה ימים אחורה (increment_offset: 3).
מפתח הגידול מבוסס על מאפיין departure_date, שהוא למעשה date מסגרת הזמן מקבוצת המאפיינים departure. (במאמר בנושא פרמטר dimension_group מוסבר איך פועלות קבוצות של מאפיינים). קבוצת המאפיינים ופרק הזמן מוגדרים בתצוגה flights, שהיא explore_source עבור ה-PDT הזה. כך מוגדרת קבוצת המאפיינים departure בקובץ התצוגה המפורטת flights:
...
dimension_group: departure {
type: time
timeframes: [
raw,
date,
week,
month,
year
]
sql: ${TABLE}.dep_time ;;
}
...
האינטראקציה בין פרמטרים של הגדלה לבין אסטרטגיית התמדה
ההגדרות increment_key ו-increment_offset של PDT לא תלויות בשיטת השמירה של ה-PDT:
- אסטרטגיית ההתמדה של ה-PDT המצטבר קובעת רק מתי ה-PDT יגדל. כלי ה-PDT Builder לא משנה את ה-PDT המצטבר אלא אם מופעלת אסטרטגיית השמירה של הטבלה, או אם ה-PDT מופעל באופן ידני באמצעות האפשרות Rebuild Derived Tables & Run ב'ניתוח נתונים'.
- כשערך ה-PDT עולה, כלי ה-PDT יקבע מתי הנתונים האחרונים נוספו לטבלה, לפי מרווח הזמן הנוכחי ביותר (תקופת הזמן שמוגדרת על ידי הפרמטר
increment_key). על סמך זה, כלי ה-PDT יקצץ את הנתונים לתחילת מרווח הזמן האחרון בטבלה, ואז יבנה את המרווח האחרון משם. - אם ל-PDT יש פרמטר
increment_offset, כלי ה-PDT Builder יבנה מחדש גם את מספר התקופות הקודמות שצוין בפרמטרincrement_offset. התקופות הקודמות מתחילות מההתחלה של מרווח הזמן הנוכחי ביותר (תקופת הזמן שמוגדרת על ידי הפרמטרincrement_key).
בדוגמאות הבאות אפשר לראות איך מתעדכנים נתוני PDT מצטברים, ואיך מתבצעת האינטראקציה בין increment_key, increment_offset ואסטרטגיית השמירה.
דוגמה 1
בדוגמה הזו נעשה שימוש ב-PDT עם המאפיינים הבאים:
- מפתח מצטבר: תאריך
- הגדלת ההיסט: 3
- אסטרטגיית התמדה: מופעלת פעם בחודש ביום הראשון של החודש
כך הטבלה הזו תעודכן:
- אסטרטגיית התמדה חודשית פירושה שהטבלה נוצרת אוטומטית פעם בחודש. לדוגמה, אם נסתכל על הטבלה ב-1 ביוני, השורה האחרונה שנוספה היא השורה שנוספה ב-1 במאי.
- מכיוון של-PDT הזה יש מפתח מצטבר שמבוסס על תאריך, הכלי ליצירת PDT יקצץ את הנתונים של 1 במאי בחזרה לתחילת היום ויבנה מחדש את הנתונים של 1 במאי ועד היום הנוכחי, 1 ביוני.
- בנוסף, ל-PDT הזה יש היסט של
3. לכן, כלי ה-PDT Builder גם בונה מחדש את הנתונים משלושת פרקי הזמן הקודמים (ימים) לפני 1 במאי. התוצאה היא שהנתונים נבנים מחדש ל-28 באפריל, ל-29 באפריל, ל-30 באפריל ועד היום הנוכחי, 1 ביוני.
במונחי SQL, זו הפקודה שכלי ה-PDT Builder יריץ ב-1 ביוני כדי לקבוע אילו שורות מתוך ה-PDT הקיים צריך לבנות מחדש:
## Example SQL for BigQuery:
SELECT FORMAT_TIMESTAMP('%F %T',TIMESTAMP_ADD(MAX(pdt_name),INTERVAL -3 DAY))
## Example SQL for other dialects:
SELECT CAST(DATE_ADD(MAX(pdt_name),INTERVAL -3 DAY) AS CHAR)
זו פקודת ה-SQL שכלי ה-PDT יריץ ב-1 ביוני כדי ליצור את העלייה האחרונה:
## Example SQL for BigQuery:
MERGE INTO [pdt_name] USING (SELECT [columns]
WHERE created_at >= TIMESTAMP('4/28/21 12:00:00 AM'))
AS tmp_name ON FALSE
WHEN NOT MATCHED BY SOURCE AND created_date >= TIMESTAMP('4/28/21 12:00:00 AM')
THEN DELETE
WHEN NOT MATCHED THEN INSERT [columns]
## Example SQL for other dialects:
START TRANSACTION;
DELETE FROM [pdt_name]
WHERE created_date >= TIMESTAMP('4/28/21 12:00:00 AM');
INSERT INTO [pdt_name]
SELECT [columns]
FROM [source_table]
WHERE created_at >= TIMESTAMP('4/28/21 12:00:00 AM');
COMMIT;
דוגמה 2
בדוגמה הזו נעשה שימוש ב-PDT עם המאפיינים הבאים:
- שיטת שימור: מופעלת פעם ביום
- מפתח מצטבר: חודש
- Increment offset: 0
כך הטבלה הזו תעודכן ב-1 ביוני:
- האסטרטגיה של שמירת נתונים יומיים פירושה שהטבלה נוצרת אוטומטית פעם ביום. ב-1 ביוני, השורה האחרונה בטבלה תהיה השורה שנוספה ב-31 במאי.
- מכיוון שמפתח התוספת מבוסס על החודש, הכלי ליצירת PDT יבצע חיתוך מ-31 במאי בחזרה לתחילת החודש ויבנה מחדש את הנתונים לכל חודש מאי ועד היום הנוכחי, כולל 1 ביוני.
- מכיוון של-PDT הזה אין היסט של תוספת, לא מתבצעת בנייה מחדש של תקופות זמן קודמות.
כך הטבלה הזו תעודכן ב-2 ביוני:
- ב-2 ביוני, השורה האחרונה בטבלה תהיה השורה שנוספה ב-1 ביוני.
- כלי ה-PDT יקצץ את הנתונים עד תחילת חודש יוני, ואז יבנה מחדש את הנתונים החל מ-1 ביוני ועד היום הנוכחי. לכן, הנתונים ייבנו מחדש רק לגבי 1 ביוני ו-2 ביוני.
- מכיוון של-PDT הזה אין היסט של תוספת, לא מתבצעת בנייה מחדש של תקופות זמן קודמות.
דוגמה 3
בדוגמה הזו נעשה שימוש ב-PDT עם המאפיינים הבאים:
- מפתח מצטבר: חודש
- הגדלת ההיסט: 3
- שיטת שימור: מופעלת פעם ביום
התרחיש הזה ממחיש הגדרה לא טובה של PDT מצטבר, כי מדובר ב-PDT עם הפעלה יומית והיסט של שלושה חודשים. המשמעות היא שכל יום יבוצע שחזור של נתונים לפחות משלושה חודשים, וזה יהיה שימוש לא יעיל במיוחד ב-PDT מצטבר. עם זאת, זהו תרחיש מעניין לבדיקה כדי להבין איך פועלים שינויים מצטברים ב-PDT.
כך הטבלה הזו תעודכן ב-1 ביוני:
- האסטרטגיה של שמירת נתונים יומיים פירושה שהטבלה נוצרת אוטומטית פעם ביום. לדוגמה, ב-1 ביוני, השורה האחרונה בטבלה תהיה השורה שנוספה ב-31 במאי.
- מכיוון שמפתח התוספת מבוסס על החודש, הכלי ליצירת PDT יבצע חיתוך מ-31 במאי בחזרה לתחילת החודש ויבנה מחדש את הנתונים לכל חודש מאי ועד היום הנוכחי, כולל 1 ביוני.
- בנוסף, ל-PDT הזה יש היסט של
3. כלומר, כלי ה-PDT יבנה מחדש גם את הנתונים משלושת פרקי הזמן הקודמים (חודשים) לפני מאי. התוצאה היא שהנתונים נבנים מחדש החל מפברואר, מרץ ואפריל, ועד היום הנוכחי, 1 ביוני.
כך הטבלה הזו תעודכן ב-2 ביוני:
- ב-2 ביוני, השורה האחרונה בטבלה תהיה השורה שנוספה ב-1 ביוני.
- כלי ה-PDT יקצץ את החודש עד 1 ביוני ויבנה מחדש את הנתונים לחודש יוני, כולל 2 ביוני.
- בנוסף, בגלל ההיסט של הגידול, כלי ה-PDT יבנה מחדש את הנתונים מ-3 החודשים הקודמים לפני יוני. התוצאה היא שהנתונים נבנים מחדש החל מחודש מרץ, אפריל ומאי, ועד היום הנוכחי, 2 ביוני.
בדיקת PDT מצטבר במצב פיתוח
לפני שפורסים PDT מצטבר חדש בסביבת הייצור, אפשר לבדוק את ה-PDT כדי לוודא שהוא נבנה ושהוא מצטבר. כדי לבדוק PDT מצטבר במצב פיתוח:
יוצרים ניתוח ל-PDT:
- בקובץ מודל משויך, משתמשים בפרמטר
includeכדי לכלול את קובץ התצוגה של ה-PDT בקובץ המודל. - באותו קובץ מודל, משתמשים בפרמטר
exploreכדי ליצור תצוגה של PDT מצטבר ב'ניתוח נתונים'.
include: "/views/e_faa_pdt.view" explore: e_faa_pdt {}- בקובץ מודל משויך, משתמשים בפרמטר
פותחים את הכלי 'חיפוש ובדיקה' עבור ה-PDT. כדי לעשות את זה, לוחצים על הלחצן הצגת פעולות בקובץ ואז בוחרים שם של ניתוח ב-Explore.

בניתוח, בוחרים כמה מאפיינים או מדדים ולוחצים על הפעלה. מערכת Looker תבנה את כל ה-PDT. אם זו השאילתה הראשונה שהרצתם ב-PDT המצטבר, כלי ה-PDT יבנה את כל ה-PDT כדי לקבל את הנתונים הראשוניים. אם הטבלה גדולה, יכול להיות שהבנייה הראשונית תימשך זמן רב, כמו כל בנייה של טבלה גדולה.
כדי לוודא שנוצר PDT ראשוני, אפשר:
- אם יש לכם הרשאה
see_logs, תוכלו לבדוק אם הטבלה נוצרה על ידי עיון ביומן האירועים של PDT. אם אתם לא רואים את האירועים של PDT ביומן האירועים של PDT, כדאי לבדוק את פרטי הסטטוס בחלק העליון של הכלי 'ניתוח נתונים' ביומן האירועים של PDT. אם מופיע הכיתוב 'מהמטמון', אפשר לבחור באפשרות ניקוי המטמון ורענון כדי לקבל מידע עדכני יותר. - אפשר גם לעיין בתגובות בכרטיסייה SQL בסרגל נתונים של כלי הניתוחים. בכרטיסייה SQL מוצגות השאילתה והפעולות שיבוצעו כשמריצים את השאילתה בכלי הניתוח. לדוגמה, אם התגובות בכרטיסייה SQL הן
,זו הפעולה שתתבצע כשתלחצו על הפעלה.-- generate derived table e_incremental_pdt
- אם יש לכם הרשאה
אחרי שיוצרים את הגרסה הראשונית של ה-PDT, מריצים בנייה מצטברת של ה-PDT באמצעות האפשרות Rebuild Derived Tables & Run (בנייה מחדש של טבלאות נגזרות והרצה) מתוך Explore.
אתם יכולים להשתמש באותן שיטות כמו קודם כדי לוודא ש-PDT נוצר באופן מצטבר:
- אם יש לכם הרשאה ל
see_logs, תוכלו להשתמש ביומן האירועים של PDT כדי לראותcreate increment completeאירועים של PDT מצטבר. אם האירוע הזה לא מופיע ביומן האירועים של PDT והסטטוס של השאילתה הוא 'ממטמון', בוחרים באפשרות ניקוי המטמון ורענון כדי לקבל מידע עדכני יותר. - בודקים את ההערות בכרטיסייה SQL בסרגל נתונים של Explore. במקרה כזה, ההערות יציינו שה-PDT עודכן. לדוגמה:
-- increment persistent derived table e_incremental_pdt to generation 2
- אם יש לכם הרשאה ל
אחרי שמוודאים ש-PDT נוצר ושהערך שלו גדל בצורה תקינה, אפשר להסיר את הפרמטרים
exploreו-includeשל ה-PDT מקובץ המודל, או להוסיף להם הערות, אם לא רוצים לשמור את ה-Explore הייעודי ל-PDT.
אחרי ש-PDT נוצר במצב פיתוח, אותו טבלה תשמש לייצור אחרי שתפרסו את השינויים, אלא אם תבצעו שינויים נוספים בהגדרה של הטבלה. מידע נוסף זמין בקטע טבלאות לשימוש חוזר במצב פיתוח בדף התיעוד טבלאות נגזרות ב-Looker.
פתרון בעיות ב-PDT מצטברות
בקטע הזה מתוארות כמה בעיות נפוצות שאתם עשויים להיתקל בהן במהלך השימוש בטבלאות PDT מצטברות, וגם מוסבר איך לפתור את הבעיות האלה.
ה-PDT המצטבר לא מצליח להיבנות אחרי שינוי בסכימה
אם ה-PDT המצטבר שלכם הוא טבלה נגזרת שמבוססת על SQL, והפרמטר sql כולל תו כללי לחיפוש כמו SELECT *, יכול להיות ששינויים בסכימת מסד הנתונים הבסיסי (כמו הוספה של עמודה, הסרה של עמודה או שינוי של סוג הנתונים בעמודה) יגרמו לכשל ב-PDT עם השגיאה הבאה:
SQL Error in incremental PDT: Query execution failed
כדי לפתור את הבעיה הזו, עורכים את ההצהרה SELECT בפרמטר sql כדי לבחור במקום זאת עמודות ספציפיות. לדוגמה, אם משפט ה-select הוא SELECT *, משנים אותו ל-SELECT column1, column2, ....
אם הסכימה משתנה ואתם רוצים לבנות מחדש את ה-PDT המצטבר מאפס, צריך להשתמש בקריאה ל-API start_pdt_build ולכלול את הפרמטר full_force_incremental.
ניבי SQL נתמכים של מסדי נתונים ל-PDT מצטבר
כדי ש-Looker יתמוך בטבלאות PDT מצטברות בפרויקט Looker, הניב של מסד הנתונים צריך לתמוך בפקודות Data Definition Language (DDL) שמאפשרות מחיקה והוספה של שורות.
בטבלה הבאה מפורטים הניבים שתומכים ב-PDT מצטבר בגרסה האחרונה של Looker (ב-Databricks, PDT מצטבר נתמך רק ב-Databricks מגרסה 12.1 ואילך):
| דיאלקט | נתמך? |
|---|---|
| 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 |