在处理 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
字段。
为什么会出现此错误?
导致此错误的原因可能包括:
- 您引用的字段不存在。
-
您引用的字段是整个维度组,例如,引用维度组时未附加
timeframe
。 - 由于缺少联接,某些探索无法访问该字段。
选项 1:字段不存在
如果 LookML 字段中引用了字段 user_order_facts.lifetime_orders
,但该字段本身并不存在,您会收到 unknown or inaccessible field
错误。
您可以通过将触发错误的字段(在此示例中为 user_order_facts.lifetime_orders
)添加到包含相关字段的视图来解决此错误。在这种情况下,您可以确保该字段已在 user_order_facts
视图中定义;如果该字段不存在,您可以添加该字段。
选项 2:字段引用整个维度组
维度组表示一组维度。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 将无法知道您所指的是哪个时间范围,并会生成错误。
选项 3:缺少联接
以下是 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
视图与“探索”联接,但 user_order_facts
未联接的情况。
如需查看是哪些探索导致了问题,您可以展开错误消息中突出显示的出现情况:
这些出现情况表明,ecommerce
模型中的 order_items
和 orders
Explore 会导致错误。这些探索包含许多联接,并在模型文件中定义如下:
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
字段。如果您尝试在任一“探索”中查询引用 user_order_facts.lifetime_orders
的 users.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
的所有探索。例如,您可能不希望用户通过 orders
“探索”中的 user_order_facts
视图访问字段,但希望用户能够通过 users
视图访问字段而不会出错。为此,您可以使用
fields
参数从 orders
“探索”中排除导致错误的字段 users.lifetime_orders
。
借助探索的 fields
参数,您可以从探索中添加或排除特定字段。在这种情况下,您可以将 users.lifetime_orders
从 orders
探索中排除,如下所示:
explore: orders { fields: [ALL_FIELDS*, -users.lifetime_orders] # exclude users.lifetime_orders join: users { relationship: many_to_one sql_on: ${orders.user_id} = ${users.id} } }