Lorsque vous travaillez sur vos fichiers LookML et que vous êtes satisfait de vos modifications, l'étape suivante pour déployer vos modifications LookML consiste à exécuter le validateur LookML pour effectuer une validation complète du modèle.
Il peut arriver que vous rencontriez une erreur semblable à celle-ci :
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
dans 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.
Arborescence de débogage
Utilisez l'arbre de décision suivant pour résoudre les problèmes courants liés à Liquid :
Les sections suivantes décrivent plus en détail les scénarios de l'arborescence.
Pourquoi cette erreur se produit-elle ?
Plusieurs raisons peuvent expliquer cette erreur :
- Le champ auquel vous faites référence n'existe pas.
-
Le champ auquel vous faites référence est un groupe de dimensions entier (par exemple, un groupe de dimensions est référencé sans
timeframe
ajouté). - Certains Explorations ne peuvent pas accéder au champ, car une jointure est manquante.
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, l'erreur unknown or inaccessible field
s'affiche.
Pour résoudre l'erreur, ajoutez le champ qui la déclenche (user_order_facts.lifetime_orders
dans cet exemple) à 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.
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.
Par exemple, considérons le groupe de dimensions suivant :
dimension_group: created { type: time timeframes: [date, week, month] sql: ${TABLE}.created_at ;; }
Si vous souhaitez référencer le groupe de dimensions created
dans un autre champ LookML, vous devez référencer une dimension période spécifique au sein du groupe, par exemple :
-
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 une erreur.
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 faire référence au champ LookMLuser_order_facts.lifetime_orders
.
La dimension lifetime_orders
de la vue users
fait référence au champ lifetime_orders
de la vue user_order_facts
. Dans ce cas, l'erreur est déclenchée, car il existe des instances dans le fichier de modèle où la vue users
est jointe à une exploration sans que la user_order_facts
ait également été jointe.
Pour identifier les explorations qui posent problème, vous pouvez développer les occurrences mises en évidence 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 joindre également la vue user_order_facts
. Par conséquent, aucune des deux explorations 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 Explore, l'erreur se déclenche.
Le validateur LookML vous avertit que les utilisateurs recevront l'erreur lorsqu'ils interrogeront users_order_facts.lifetime_orders
. Le champ users.lifetime_orders
ne déclenchera pas l'erreur dans une exploration à laquelle user_order_facts
est également joint.
Par exemple, prenons l'exploration users
:
explore: users { join: user_order_facts { sql_on: ${users.id} = ${user_order_facts.users_id} } }
Ici, user_order_facts
est joint, donc l'interrogation de users.lifetime_orders
ne déclenchera pas d'erreur.
Comment corriger l'erreur lorsqu'elle est due à une jointure manquante ?
Si l'erreur est due à une jointure manquante, vous pouvez la corriger de plusieurs façons :
-
Joignez la vue manquante dans tous les cas. Pour l'exemple utilisé tout au long de cette page, assurez-vous que la vue
user_order_facts
est associée à chaque fois que la vueusers
est associée 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. Cela garantit que 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 de 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 exécutez à nouveau le validateur LookML, cette erreur ne devrait pas s'afficher.
Exclure le champ qui provoque l'erreur des explorations
Vous ne souhaitez peut-être pas joindre la vue user_order_facts
à toutes les explorations auxquelles users
est joint. Par exemple, vous ne souhaitez peut-être pas que les utilisateurs accèdent aux champs de la vue user_order_facts
dans l'exploration orders
, mais vous souhaitez qu'ils accèdent aux champs 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 le champ users.lifetime_orders
de l'exploration orders
comme suit :
explore: orders { fields: [-users.lifetime_orders] # exclude users.lifetime_orders join: users { relationship: many_to_one sql_on: ${orders.user_id} = ${users.id} } }