處理 LookML 檔案並對更新內容感到滿意後,部署 LookML 變更的下一個步驟是執行 LookML 驗證工具,進行完整的模型驗證。
有時您可能會看到類似下列內容的錯誤:
Unknown or inaccessible field "user_order_facts.lifetime_orders" referenced in "users.lifetime_orders". Check for typos and missing joins.
在本例中,錯誤是指 users 檢視區塊中的 lifetime_orders 欄位。這項錯誤表示 users.lifetime_orders 無法存取所參照的 user_order_facts.lifetime_orders 欄位。
偵錯樹狀結構
請使用下列決策樹排解常見的 Liquid 問題:
以下各節將進一步說明樹狀結構中的情境。
為什麼會發生這個錯誤?
造成這項錯誤的原因如下:
- 您參照的欄位不存在。
-
您參照的欄位是整個維度群組,例如參照維度群組時未附加
timeframe。 - 部分探索無法存取該欄位,因為缺少聯結。
欄位不存在
如果 LookML 欄位參照了 user_order_facts.lifetime_orders 欄位,但該欄位本身不存在,您會收到 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 ;;
}
如要在其他 LookML 欄位中參照 created 維度群組,您必須參照群組中的特定時間範圍維度,例如下列其中一個:
-
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。
users 檢視中的 lifetime_orders 維度會參照 user_order_facts 檢視中的 lifetime_orders 欄位。在本例中,模型檔案中的執行個體會觸發錯誤,因為 users 檢視區塊已加入 Explore ,但 user_order_facts 尚未加入。
如要查看造成問題的探索,請展開錯誤訊息中醒目顯示的事件:
這些事件表示 ecommerce 模型中的 order_items 和 orders 探索導致錯誤。這些探索具有許多聯結,並在模型檔案中定義如下:
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),就會觸發錯誤。
LookML 驗證工具會發出警告,指出使用者查詢 users_order_facts.lifetime_orders 時會收到錯誤訊息。如果 user_order_facts 也加入探索,users.lifetime_orders 欄位就不會觸發錯誤。
舉例來說,請考慮「探索」users:
explore: users {
join: user_order_facts {
sql_on: ${users.id} = ${user_order_facts.users_id}
}
}
這裡已加入 user_order_facts ,因此查詢 users.lifetime_orders 不會觸發錯誤。
如果錯誤是由於缺少聯結所致,該如何修正?
如果錯誤是由缺少聯結所致,可以透過下列幾種方式修正:
-
在所有案件中加入缺少的檢視畫面。如要使用本頁面中的範例,請確保在「探索」中彙整
users檢視區塊時,user_order_facts檢視區塊也會彙整。 - 如果不希望加入缺少的檢視區塊,請從探索中排除導致錯誤的欄位。
加入缺少的檢視畫面
在上述範例中,只要將 user_order_facts 加入所有也加入 users 的探索,即可解決錯誤。這樣一來,當查詢中使用 users.lifetime_orders 時,探索就能存取 user_order_facts.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 檢視畫面中存取欄位,但希望使用者在 users 檢視畫面中存取欄位時不會發生錯誤。orders如要解決這個問題,請使用 fields 參數,從「探索」中排除導致錯誤的欄位 (users.lifetime_orders)。orders
您可以使用「探索」的 fields 參數,在探索中納入或排除特定欄位。在這種情況下,您可以從 orders 探索中排除 users.lifetime_orders 欄位,如下所示:
explore: orders {
fields: [-users.lifetime_orders] # exclude users.lifetime_orders
join: users {
relationship: many_to_one
sql_on: ${orders.user_id} = ${users.id}
}
}