Error: Campo desconocido o inaccesible

Cuando trabajes 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.

En ocasiones, 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.

Árbol de depuración

Usa el siguiente árbol de decisión para solucionar problemas comunes de Liquid:

En las siguientes secciones, se describen las situaciones del árbol con más detalle.

¿Por qué se produce este error?

Este error puede ocurrir por 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 untimeframeagregado.
  3. Algunos Explorar no pueden acceder al campo porque falta una unión.

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 lo activa (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.

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íodos 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 deseas hacer referencia al grupo de dimensiones created en otro campo de LookML, debes hacer referencia a una dimensión de período 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.

Falta una unión

A continuación, se incluye 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 user_order_facts.lifetime_orders de LookML.

La dimensión lifetime_orders en 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 un Explorar sin que también se haya unido el user_order_facts.

Para ver qué Explorar está causando el problema, puedes expandir las ocurrencias que se destacan en el mensaje de error:

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

Estos casos muestran que los Explorar order_items y orders en el modelo ecommerce están causando el error. Estos Explores tienen muchas uniones y se definen de la siguiente manera en el archivo del 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 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 intentaras consultar el campo users.lifetime_orders (que hace referencia a user_order_facts.lifetime_orders) en cualquiera de las dos opciones de Explorar, se activaría 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 une user_order_facts.

Por ejemplo, considera la función users Explorar:

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

Aquí user_order_facts se une, por lo que la consulta de users.lifetime_orders no activará un error.

¿Cómo puedo corregir el error cuando se debe a una unión faltante?

Si el error se debe a una unión faltante, puedes corregirlo de dos maneras:

  1. Une la vista faltante en todos los casos. En el ejemplo que se usa en toda esta página, asegúrate de que la vista user_order_facts se una dondequiera que la vista users se una en un Explore.
  2. Excluye el campo que causa el error de los Explorar si no quieres unir la vista faltante.

Unirse a la vista faltante

En el ejemplo anterior, el error se puede resolver uniendo user_order_facts a todos los Explorar en los que también se une users. Esto garantizará que Explorar pueda acceder a user_order_facts.lifetime_orders cuando se use users.lifetime_orders en una búsqueda.

Puedes usar el panel de metadatos en el IDE para ver todos los Explorar 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 de las exploraciones el campo que causa el error

Es posible que no desees unir la vista user_order_facts a todos los Explores en los que se une users. Por ejemplo, tal vez no quieras que los usuarios accedan a los campos de la vista user_order_facts en el Explorador orders, pero quieras 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 función Explorar orders con el parámetro fields.

El parámetro fields para Exploraciones te permite incluir o excluir campos específicos de una exploración. En este caso, puedes 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}
    }
  }