שגיאה: שדה לא ידוע או לא נגיש

כשעובדים על קובצי LookML ומרוצים מהעדכונים, השלב הבא בפריסת השינויים ב-LookML הוא הפעלת כלי האימות של LookML כדי לבצע אימות מלא של המודל.

מדי פעם, יכול להיות שתופיע שגיאה כמו זו:

 Unknown or inaccessible field "user_order_facts.lifetime_orders" referenced in "users.lifetime_orders". Check for typos and missing joins.

בדוגמה הזו, השגיאה מתייחסת לשדה lifetime_orders בתצוגה users. השגיאה מציינת של-users.lifetime_orders אין גישה לשדה user_order_facts.lifetime_orders שהוא מפנה אליו.

עץ ניפוי הבאגים

כדי לפתור בעיות נפוצות ב-Liquid, אפשר להיעזר בתרשים הבא של עץ החלטות:

בקטעים הבאים מפורטים התרחישים בעץ.

למה השגיאה הזו מתרחשת?

יש כמה סיבות להופעת השגיאה הזו:

  1. השדה שאליו מפנים לא קיים.
  2. השדה שאליו מתבצעת ההפניה הוא קבוצת מאפיינים שלמה – לדוגמה, מתבצעת הפניה לקבוצת מאפיינים בלי להוסיףtimeframe.
  3. השדה לא נגיש לחלק מה-Explores כי חסר איחוד (join).

השדה לא קיים

אם יש הפניה לשדה user_order_facts.lifetime_orders בשדות LookML אבל הוא לא קיים כשדה, תוצג השגיאה unknown or inaccessible field.

כדי לפתור את השגיאה, מוסיפים לתצוגה שמכילה את השדה הבעייתי את השדה שגורם לשגיאה – בדוגמה הזו, user_order_facts.lifetime_orders. במקרה כזה, אפשר לוודא שהשדה מוגדר בתצוגה user_order_facts. אם הוא לא מוגדר, אפשר להוסיף אותו.

השדה מפנה לקבוצת מאפיינים שלמה

קבוצות מאפיינים מייצגות קבוצה של מאפיינים. קבוצות המאפיינים type: time מייצגות קבוצה של מאפיינים של תקופות זמן שמוגדרים בפרמטר timeframe. כשמפנים לקבוצות של מאפיינים ב-LookML, חובה לצרף את המאפיין המתאים – timeframe במקרה הזה – לשם של קבוצת המאפיינים.

לדוגמה, קבוצת המאפיינים הבאה:

  dimension_group: created {
    type: time
    timeframes: [date, week, month]
    sql: ${TABLE}.created_at ;;
  }

אם רוצים להפנות אל קבוצת המאפיינים created בשדה LookML אחר, צריך להפנות אל מאפיין מסגרת זמן ספציפי בתוך הקבוצה, כמו אחד מהמאפיינים הבאים:

  • date: ${created_date}
  • week: ${created_week}
  • month: ${created_month}

אם תנסו להשתמש רק בשם של קבוצת המאפיינים – ${created} – מערכת Looker לא תדע לאיזה פרק זמן אתם מתכוונים ותציג את השגיאה.

חסר צירוף

ההגדרה של users.lifetime_orders ב-LookML היא:

  dimension: lifetime_orders {
    type: number
    sql: ${user_order_facts.lifetime_orders};;
  }
שימו לב לשימוש באופרטורים של החלפה ${} כדי להפנות לשדה LookML‏ user_order_facts.lifetime_orders.

המאפיין lifetime_orders בתצוגה users מפנה לשדה lifetime_orders בתצוגה user_order_facts. במקרה הזה, השגיאה מופעלת כי יש מקרים בקובץ המודל שבהם התצוגה users מצורפת ל-Explore בלי שגם user_order_facts צורף.

כדי לראות אילו ניתוחים ב-Explore גורמים לבעיה, אפשר להרחיב את המופעים שמודגשים בהודעת השגיאה:

הודעת שגיאה מורחבת שמציגה את התצוגות, את שורות הקוד של התצוגות ואת הניתוחים של שני גורמים: users:79 (ecommerce:order_items) ו-users:79 (ecommerce:orders).

המקרים האלה מראים שהשגיאה נגרמת בגלל ה-Explores‏ order_items ו-orders במודל ecommerce. ל-Explores האלה יש הרבה joins והם מוגדרים כך בקובץ המודל:

  explore: orders {
    join: users { # users joined without user_order_facts
      relationship: many_to_one
      sql_on: ${orders.user_id} = ${users.id}
    }
  }

  explore: order_items {
    join: inventory_items {
      relationship: many_to_one
      sql_on: ${order_items.inventory_item_id} = ${inventory_items.id}
    }
    join: orders {
      relationship: many_to_one
      sql_on: ${order_items.order_id} = ${orders.id}
    }
    join: users { # users joined without user_order_facts
      relationship: many_to_one
      sql_on: ${orders.user_id} = ${users.id}
    }
  }

בשני הניתוחים האלה, התצוגה users מצורפת בלי לצרף גם את התצוגה user_order_facts. לכן, אף אחד מהניתוחים לא יכול לגשת לשדה user_order_facts.lifetime_orders. אם תנסו לשלוח שאילתה לשדה users.lifetime_orders – שמפנה לשדה user_order_facts.lifetime_orders – ב-Explore, תופיע השגיאה.

כלי התיקוף של LookML מזהיר אתכם שהמשתמשים יקבלו את השגיאה כשהם יריצו שאילתה על users_order_facts.lifetime_orders. השדה users.lifetime_orders לא יפעיל את השגיאה בניתוח ב-Explore שגם user_order_facts מצורף אליו.

לדוגמה, נניח שאתם רוצים להשתמש באפשרות users ניתוח:

  explore: users {
    join: user_order_facts {
      sql_on: ${users.id} = ${user_order_facts.users_id}
    }
  }

כאן user_order_facts is מצטרף, ולכן שאילתה של users.lifetime_orders לא תפעיל שגיאה.

איך אפשר לתקן את השגיאה אם היא נגרמת בגלל צירוף חסר?

אם השגיאה נגרמת בגלל צירוף חסר, אפשר לתקן אותה בכמה דרכים:

  1. הצטרפות לתצוגה החסרה בכל בקשות התמיכה. בדוגמה שמופיעה לאורך הדף הזה, חשוב לוודא שהתצוגה המפורטת user_order_facts מצורפת בכל מקום שבו התצוגה המפורטת users מצורפת בניתוח ב-Explore.
  2. אם לא רוצים לצרף את התצוגה החסרה, אפשר להחריג את השדה שגורם לשגיאה מהפריטים בתפריט Explore (חקירות).

הצטרפות לתצוגה החסרה

בדוגמה הקודמת, אפשר לפתור את השגיאה על ידי צירוף user_order_facts לכל התצוגות המפורטות שבהן מצורף גם users. כך תוכלו לוודא שניתן לגשת ל-user_order_facts.lifetime_orders מניתוחים כשמשתמשים ב-users.lifetime_orders בשאילתה.

אפשר להשתמש בחלונית המטא-נתונים ב-IDE כדי לראות את כל הניתוחים באמצעות התצוגה users.

בדוגמה הבאה, הצטרפות לתצוגות החסרות:

  explore: order_items {
    join: inventory_items {
      relationship: many_to_one
      sql_on: ${inventory_items.id} = ${order_items.inventory_item_id}
    }
    join: orders {
      relationship: many_to_one
      sql_on: ${order_items.order_id} = ${orders.id}
    }
    join: users {
      relationship: many_to_one
      sql_on: ${orders.user_id} = ${users.id}
    }
    join: user_order_facts { # join user_order_facts through users
      relationship: many_to_one
      sql_on: ${users.id} = ${user_order_facts.users_id}
    }
  }

אם מריצים עכשיו שוב את מאמת LookML, השגיאה הזו לא אמורה להופיע.

החרגת השדה שגורם לשגיאה מניתוחים

יכול להיות שלא תרצו לצרף את התצוגה user_order_facts לכל הניתוחים שבהם מצורפת users. לדוגמה, יכול להיות שלא תרצו שהמשתמשים יוכלו לגשת לשדות מהתצוגה user_order_facts בorders ניתוח, אבל כן תרצו שהם יוכלו לגשת לשדות מהתצוגה users בלי שיוצג להם שגיאה. כדי לעשות את זה, צריך להחריג את השדה שגורם לשגיאה – users.lifetime_orders – מהדוח ב-Explore באמצעות הפרמטר fields.orders

הפרמטר fields של כלי הניתוחים מאפשר לכם לכלול או להחריג שדות ספציפיים מניתוח. במקרה כזה, אפשר להחריג את השדה users.lifetime_orders מהניתוח orders ב-Explore באופן הבא:

  explore: orders {
    fields: [-users.lifetime_orders] # exclude users.lifetime_orders
    join: users {
      relationship: many_to_one
      sql_on: ${orders.user_id} = ${users.id}
    }
  }