Cuando trabajas en tus archivos de LookML y estás conforme con las actualizaciones, el siguiente paso para implementar los cambios de LookML es ejecutar el validador de LookML para realizar una validación completa del modelo.
Ocasionalmente, es posible que veas un error como el siguiente:
Unknown or inaccessible field "user_order_facts.lifetime_orders" referenced in "users.lifetime_orders". Check for typos and missing joins.
En este ejemplo, el error hace referencia al campo lifetime_orders
en la vista users
. El error indica que users.lifetime_orders
no puede acceder al campo user_order_facts.lifetime_orders
al que hace referencia.
¿Por qué se produce este error?
Este error puede ocurrir por varios motivos:
- El campo al que haces referencia no existe.
-
El campo al que haces referencia es un grupo de dimensiones completo; por ejemplo, se hace referencia a un grupo de dimensiones sin un
timeframe
agregado. - Algunas exploraciones no pueden acceder al campo porque falta una unión.
Opción 1: El campo no existe
Si se hace referencia al campo user_order_facts.lifetime_orders
en los campos de LookML, pero no existe como campo en sí, recibirás el error unknown or inaccessible field
.
Para resolver el error, agrega el campo que activa el error (en este ejemplo, user_order_facts.lifetime_orders
) a la vista que contiene el campo en cuestión. En este caso, puedes asegurarte de que el campo esté definido en la vista user_order_facts
. Si no existe, puedes agregarlo.
Opción 2: El campo hace referencia a un grupo de dimensiones completo
Los grupos de dimensiones representan un grupo de dimensiones. Los grupos de dimensiones type: time
representan un grupo de dimensiones de período que se definen en el parámetro timeframe
. Cuando haces referencia a grupos de dimensiones en LookML, debes agregar la dimensión adecuada (timeframe
, en este caso) al nombre del grupo de dimensiones.
Por ejemplo, considera el siguiente grupo de dimensiones:
dimension_group: created { type: time timeframes: [date, week, month] sql: ${TABLE}.created_at ;; }
Si quieres hacer referencia al grupo de dimensiones created
en otro campo de LookML, debes hacer referencia a una dimensión de período de tiempo específica dentro del grupo, como una de las siguientes:
-
date
:${created_date}
-
week
:${created_week}
-
month
:${created_month}
Si intentas usar solo el nombre del grupo de dimensiones ${created}
, Looker no sabrá a qué período te refieres y generará el error.
Opción 3: Falta una combinación
A continuación, se muestra la definición de LookML de users.lifetime_orders
:
dimension: lifetime_orders { type: number sql: ${user_order_facts.lifetime_orders};; }
Ten en cuenta el uso de los operadores de sustitución${}
para hacer referencia al campo de LookMLuser_order_facts.lifetime_orders
.
La dimensión lifetime_orders
de la vista users
hace referencia al campo lifetime_orders
de la vista user_order_facts
. En este caso, el error se activa porque hay instancias en el archivo del modelo en las que la vista users
se une a una exploración sin que también se haya unido user_order_facts
.
Para ver qué exploraciones están causando el problema, puedes expandir los casos que se destacan en el mensaje de error:
Estos casos muestran que las exploraciones order_items
y orders
del modelo ecommerce
están causando el error. Estas exploraciones tienen muchas uniones y se definen en el archivo del modelo de la siguiente manera:
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} } }
En ambas exploraciones, la vista users
se une sin unirse también a la vista user_order_facts
. Por lo tanto, ninguna de las exploraciones puede acceder al campo user_order_facts.lifetime_orders
. Si intentas consultar el campo users.lifetime_orders
, que hace referencia a user_order_facts.lifetime_orders
, en cualquiera de las exploraciones, activa el error.
El validador de LookML te advierte que los usuarios recibirán el error cuando consulten users_order_facts.lifetime_orders
. El campo users.lifetime_orders
no activará el error en una exploración a la que también se haya unido user_order_facts
.
Por ejemplo, considera la exploración users
:
explore: users { join: user_order_facts { sql_on: ${users.id} = ${user_order_facts.users_id} } }
Aquí está unido user_order_facts
, por lo que consultar users.lifetime_orders
no activará un error.
¿Cómo puedo corregir el error cuando se debe a una unión faltante?
Si la causa del error es una unión faltante, puedes corregir este error de dos maneras:
-
Une la vista faltante en todos los casos. Para el ejemplo que se usa en esta página, asegúrate de que la vista
user_order_facts
se una a la vistausers
en una exploración. - Excluye el campo que causa el error de Explora si no quieres unirte a la vista faltante.
Unirse a la vista que falta
En el ejemplo anterior, el error se puede resolver uniendo user_order_facts
a todas las exploraciones en las que también se une users
. Esto garantizará que las exploraciones puedan acceder a user_order_facts.lifetime_orders
cuando se use users.lifetime_orders
en una consulta.
Puedes usar el panel de metadatos en el IDE para ver todas las exploraciones que usan la vista users
.
En el siguiente ejemplo, se unen las vistas faltantes:
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} } }
Ahora, si vuelves a ejecutar el validador de LookML, este error no debería aparecer.
Excluye el campo que causa el error de Exploraciones.
Tal vez no quieras unirte a la vista user_order_facts
a todas las exploraciones en las que users
está unido. Por ejemplo, tal vez no quieras que los usuarios accedan a los campos de la vista user_order_facts
en la exploración de orders
, pero sí quieres que accedan a los campos de la vista users
sin errores. Para ello, excluye el campo que causa el error users.lifetime_orders
de la exploración de orders
con el parámetro
fields
.
El parámetro fields
de Exploraciones te permite incluir o excluir campos específicos de una exploración. En este caso, puedes excluir users.lifetime_orders
de la exploración de orders
de la siguiente manera:
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} } }