Error: campo desconocido o inaccesible

Cuando estés trabajando en tus archivos de LookML y estés conforme con los cambios, el siguiente paso para desplegar los cambios de LookML es ejecutar el Validador de LookML para realizar una validación completa del modelo.

En ocasiones, puede 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 de la vista users. El error indica que users.lifetime_orders no puede acceder al campo user_order_facts.lifetime_orders al que hace referencia.

Árbol de depuración

Sigue este esquema para solucionar problemas habituales de Liquid:

En las siguientes secciones se describen los escenarios del árbol con más detalle.

¿Por qué se produce este error?

Este error puede deberse a varios motivos:

  1. El campo al que haces referencia no existe.
  2. El campo al que haces referencia es un grupo de dimensiones completo. Por ejemplo, se hace referencia a un grupo de dimensiones sin añadir timeframe.
  3. Algunas Exploraciones no pueden acceder al campo porque falta una combinación.

El campo no existe

Si se hace referencia al campo user_order_facts.lifetime_orders en campos de LookML, pero no existe como campo en sí, recibirás el error unknown or inaccessible field.

Para resolver el error, añade el campo que lo está provocando (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 añadirlo.

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 periodo que se definen en el parámetro timeframe. Cuando haces referencia a grupos de dimensiones en LookML, debes añadir la dimensión adecuada (timeframe en este caso) al nombre del grupo de dimensiones.

Por ejemplo, supongamos que tiene 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 periodo específica 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é periodo te refieres y generará un error.

Falta una unió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 LookML user_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 de modelo en las que la vista users se une a una exploración sin que se haya unido también la user_order_facts.

Para ver qué Exploraciones están causando el problema, puedes desplegar las ocurrencias resaltadas en el mensaje de error:

Mensaje de error ampliado que muestra las vistas, las líneas de código de vista y las exploraciones de dos causas: users:79 (ecommerce:order_items) y users:79 (ecommerce:orders).

Estas incidencias muestran que las exploraciones order_items y orders del modelo ecommerce están provocando el error. Estos Exploraciones tienen muchas combinaciones y se definen de la siguiente manera en el archivo de modelo:

  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 combina sin combinar también la vista user_order_facts, por lo que ninguna de las Exploraciones puede acceder al campo user_order_facts.lifetime_orders. Si intentaras consultar el campo users.lifetime_orders, que hace referencia a user_order_facts.lifetime_orders, en Explorar, se produciría un error.

El validador de LookML te avisa de 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, echa un vistazo a la exploración users:

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

Aquí se une user_order_facts is, por lo que al consultar users.lifetime_orders no se producirá ningún error.

¿Cómo puedo solucionar el error cuando se debe a una unión que falta?

Si el error se debe a una unión que falta, puede corregirlo de dos formas:

  1. Únete a la vista que falta en Todos los casos. En el ejemplo que se usa en esta página, asegúrate de que la vista user_order_facts se combine siempre que se combine la vista users en una Exploración.
  2. Excluye del Explorador el campo que provoca el error si no quieres combinar la vista que falta.

Unirse a la vista que falta

En el ejemplo anterior, el error se puede solucionar uniendo user_order_facts a todas las exploraciones en las que también se haya unido users. De esta forma, Exploraciones podrá acceder a user_order_facts.lifetime_orders cuando se use users.lifetime_orders en una consulta.

Puedes usar el panel de metadatos del IDE para ver todos los Exploraciones que usan la vista users.

En el siguiente ejemplo se combinan las vistas que faltan:

  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.

Excluir de Exploraciones el campo que provoca el error

Puede que no quieras unir la vista user_order_facts a todas las Exploraciones en las que se haya unido users. Por ejemplo, puede que no quieras que los usuarios accedan a los campos de la vista user_order_facts de Explorar, pero quieres que accedan a los campos de la vista users sin que se produzca ningún error.orders Para ello, excluye del Explorador orders el campo que provoca el error (users.lifetime_orders) mediante 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, puede excluir el campo users.lifetime_orders de la exploración orders de la siguiente manera:

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