處理 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
,因此觸發錯誤。
如要查看造成問題的 Explore,請展開錯誤訊息中醒目顯示的事件:
這些事件表示 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
參數,從「探索」orders
中排除導致錯誤的欄位 users.lifetime_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} } }