Erreur: Champ inconnu ou inaccessible

Lorsque vous travaillez sur vos fichiers LookML et que vos mises à jour vous conviennent, l'étape suivante pour déployer vos modifications LookML consiste à exécuter l'outil de validation LookML pour effectuer une validation complète du modèle.

Ce message d'erreur peut parfois s'afficher:

 Unknown or inaccessible field "user_order_facts.lifetime_orders" referenced in "users.lifetime_orders". Check for typos and missing joins.

Dans cet exemple, l'erreur fait référence au champ lifetime_orders de la vue users. Cette erreur indique que users.lifetime_orders ne peut pas accéder au champ user_order_facts.lifetime_orders auquel il fait référence.

Pourquoi cette erreur se produit-elle ?

Cette erreur peut se produire pour plusieurs raisons:

  1. Le champ que vous référencez n'existe pas.
  2. Le champ que vous référencez est un groupe de dimensions entier. Par exemple, un groupe de dimensions est référencé sans l'ajout d'un timeframe.
  3. Le champ est inaccessible pour certaines explorations, car il manque une jointure.

Option 1: Le champ n'existe pas

Si le champ user_order_facts.lifetime_orders est référencé dans des champs LookML, mais n'existe pas en tant que champ lui-même, vous recevrez l'erreur unknown or inaccessible field.

Pour résoudre l'erreur, ajoutez le champ qui la déclenche (dans cet exemple, user_order_facts.lifetime_orders) à la vue qui contient le champ en question. Dans ce cas, vous pouvez vous assurer que le champ est défini dans la vue user_order_facts. S'il n'existe pas, vous pouvez l'ajouter.

Option 2: le champ fait référence à un groupe de dimensions entier

Les groupes de dimensions représentent un groupe de dimensions. Les groupes de dimensions type: time représentent un groupe de dimensions de période, définies dans le paramètre timeframe. Lorsque vous référencez des groupes de dimensions dans LookML, vous devez ajouter la dimension appropriée (timeframe, dans ce cas) au nom du groupe de dimensions.

Prenons l'exemple du groupe de dimensions suivant:

  dimension_group: created {
    type: time
    timeframes: [date, week, month]
    sql: ${TABLE}.created_at ;;
  }

Si vous souhaitez faire référence au groupe de dimensions created dans un autre champ LookML, vous devez faire référence à une dimension de période spécifique au sein du groupe, comme l'une des dimensions suivantes:

  • date : ${created_date}
  • week : ${created_week}
  • month: ${created_month}

Si vous essayez d'utiliser uniquement le nom du groupe de dimensions (${created}), Looker ne saura pas à quelle période vous faites référence et générera l'erreur.

Option 3: Il manque une jointure

Voici la définition LookML de users.lifetime_orders:

  dimension: lifetime_orders {
    type: number
    sql: ${user_order_facts.lifetime_orders};;
  }
Notez l'utilisation des opérateurs de substitution ${} pour référencer le champ LookML user_order_facts.lifetime_orders.

La dimension lifetime_orders dans la vue users référence le champ lifetime_orders de la vue user_order_facts. Dans ce cas, l'erreur est déclenchée, car, dans le fichier de modèle, la vue users est jointe à une exploration sans que le user_order_facts ait également été joint.

Pour identifier les explorations à l'origine du problème, vous pouvez développer les occurrences en surbrillance dans le message d'erreur:

Message d'erreur développé affichant les vues, les lignes de code d'affichage et les explorations pour deux causes: users:79 (ecommerce:order_items) et users:79 (ecommerce:orders).

Ces occurrences montrent que les explorations order_items et orders du modèle ecommerce sont à l'origine de l'erreur. Ces explorations comportent de nombreuses jointures et sont définies comme suit dans le fichier de modèle:

  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}
    }
  }

Dans ces deux explorations, la vue users est jointe sans également joindre la vue user_order_facts. Par conséquent, aucune exploration ne peut accéder au champ user_order_facts.lifetime_orders. Si vous essayez d'interroger le champ users.lifetime_orders, qui fait référence à user_order_facts.lifetime_orders, dans l'une ou l'autre des explorations, l'erreur se produisait.

Le programme de validation LookML vous avertit que les utilisateurs recevront l'erreur s'ils interrogent users_order_facts.lifetime_orders. Le champ users.lifetime_orders ne déclenche pas l'erreur dans une exploration à laquelle user_order_facts a également été joint.

Prenons l'exemple de l'exploration users:

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

Ici, user_order_facts est joint. Par conséquent, l'interrogation de users.lifetime_orders ne déclenche pas d'erreur.

Comment corriger l'erreur si elle est causée par une jointure manquante ?

Si l'erreur est causée par une jointure manquante, vous pouvez la corriger de plusieurs façons:

  1. Joindre la vue manquante dans tous les cas. Pour l'exemple utilisé sur cette page, assurez-vous que la vue user_order_facts est jointe chaque fois que la vue users est jointe dans une exploration.
  2. Excluez le champ à l'origine de l'erreur des explorations si vous ne souhaitez pas joindre la vue manquante.

Rejoindre la vue manquante

Dans l'exemple précédent, l'erreur peut être résolue en joignant user_order_facts à toutes les explorations où users est également joint. Ainsi, les explorations peuvent accéder à user_order_facts.lifetime_orders lorsque users.lifetime_orders est utilisé dans une requête.

Vous pouvez utiliser le panneau des métadonnées de l'IDE pour afficher toutes les explorations qui utilisent la vue users.

L'exemple suivant joint les vues manquantes:

  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}
    }
  }

Si vous réexécutez le programme de validation LookML, cette erreur ne devrait plus apparaître.

Exclure des explorations le champ à l'origine de l'erreur

Vous ne souhaitez peut-être pas joindre la vue user_order_facts à toutes les explorations auxquelles users est joint. Par exemple, il se peut que vous ne souhaitiez pas que les utilisateurs accèdent aux champs de la vue user_order_facts de l'exploration orders, mais que vous voudriez que les utilisateurs puissent y accéder à partir de la vue users sans erreur. Pour ce faire, excluez le champ à l'origine de l'erreur users.lifetime_orders de l'exploration orders à l'aide du paramètre fields.

Le paramètre fields pour les explorations vous permet d'inclure ou d'exclure des champs spécifiques d'une exploration. Dans ce cas, vous pouvez exclure users.lifetime_orders de l'exploration orders comme suit:

  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}
    }
  }