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:
- Le champ que vous référencez n'existe pas.
-
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
. - 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 LookMLuser_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:
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:
-
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 vueusers
est jointe dans une exploration. - 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} } }