Errore: campo sconosciuto o inaccessibile

Quando lavori sui file LookML e sei soddisfatto degli aggiornamenti, il passaggio successivo per eseguire il deployment delle modifiche a LookML è eseguire lo strumento di convalida LookML per eseguire una convalida completa del modello.

A volte potresti visualizzare un errore come il seguente:

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

In questo esempio, l'errore si riferisce al campo lifetime_orders nella visualizzazione users. L'errore indica che users.lifetime_orders non può accedere al campo user_order_facts.lifetime_orders a cui fa riferimento.

Albero di debug

Utilizza la seguente struttura decisionale per risolvere i problemi comuni di Liquid:

Le sezioni seguenti descrivono in modo più dettagliato gli scenari nell'albero.

Perché si verifica questo errore?

Questo errore può verificarsi per diversi motivi:

  1. Il campo a cui fai riferimento non esiste.
  2. Il campo a cui fai riferimento è un intero gruppo di dimensioni. Ad esempio, viene fatto riferimento a un gruppo di dimensioni senza un timeframe aggiunto.
  3. Il campo non è accessibile da alcune esplorazioni perché manca un'unione.

Il campo non esiste

Se viene fatto riferimento al campo user_order_facts.lifetime_orders nei campi LookML, ma non esiste come campo, riceverai l'errore unknown or inaccessible field.

Puoi risolvere l'errore aggiungendo il campo che lo attiva, in questo esempio user_order_facts.lifetime_orders, alla vista che contiene il campo in questione. In questo caso, puoi assicurarti che il campo sia definito nella visualizzazione user_order_facts; se non esiste, puoi aggiungerlo.

Il campo fa riferimento a un intero gruppo di dimensioni

I gruppi di dimensioni rappresentano un gruppo di dimensioni. I gruppi di dimensioni type: time rappresentano un gruppo di dimensioni del periodo di tempo definite nel parametro timeframe. Quando fai riferimento ai gruppi di dimensioni in LookML, devi aggiungere la dimensione appropriata, timeframe in questo caso, al nome del gruppo di dimensioni.

Ad esempio, considera il seguente gruppo di dimensioni:

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

Se vuoi fare riferimento al gruppo di dimensioni created in un altro campo LookML, devi fare riferimento a una dimensione intervallo di tempo specifica all'interno del gruppo, ad esempio una delle seguenti:

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

Se provi a utilizzare solo il nome del gruppo di dimensioni, ${created}, Looker non saprà a quale periodo di tempo ti riferisci e genererà l'errore.

Manca un join

Di seguito è riportata la definizione di users.lifetime_orders in LookML:

  dimension: lifetime_orders {
    type: number
    sql: ${user_order_facts.lifetime_orders};;
  }
Tieni presente l'utilizzo degli operatori di sostituzione ${} per fare riferimento al campo LookML user_order_facts.lifetime_orders.

La dimensione lifetime_orders nella visualizzazione users fa riferimento al campo lifetime_orders della visualizzazione user_order_facts. In questo caso, l'errore viene attivato perché nel file del modello sono presenti istanze in cui la vista users è unita a un'esplorazione senza che sia stata unita anche user_order_facts.

Per vedere quali esplorazioni causano il problema, puoi espandere le occorrenze evidenziate nel messaggio di errore:

Messaggio di errore espanso che mostra le visualizzazioni, le righe di codice di visualizzazione e le esplorazioni di due cause: utenti:79 (ecommerce:order_items) e utenti:79 (ecommerce:orders).

Queste occorrenze mostrano che le esplorazioni order_items e orders nel modello ecommerce causano l'errore. Questi Explore hanno molti join e sono definiti come segue nel file del modello:

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

In entrambe queste esplorazioni, la visualizzazione users viene unita senza unire anche la visualizzazione user_order_facts. Di conseguenza, nessuna delle due esplorazioni può accedere al campo user_order_facts.lifetime_orders. Se hai provato a eseguire una query sul campo users.lifetime_orders, che fa riferimento a user_order_facts.lifetime_orders, in Explore, si attiverà l'errore.

Il validatore LookML ti avvisa che gli utenti riceveranno l'errore quando eseguono query su users_order_facts.lifetime_orders. Il campo users.lifetime_orders non attiverà l'errore in un'esplorazione a cui è unito anche user_order_facts.

Ad esempio, considera l'esplorazione users:

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

Qui user_order_facts is è unito, quindi l'esecuzione di query su users.lifetime_orders non attiverà un errore.

Come posso correggere l'errore quando è causato da un'unione mancante?

Se l'errore è causato da una join mancante, puoi risolverlo in due modi:

  1. Unisciti alla visualizzazione mancante in Tutte le richieste. Per l'esempio utilizzato in questa pagina, assicurati che la visualizzazione user_order_facts sia unita ovunque sia unita la visualizzazione users in un'esplorazione.
  2. Escludi il campo che causa l'errore dalle esplorazioni se non vuoi unire la visualizzazione mancante.

Unisciti alla visualizzazione mancante

Nell'esempio precedente, l'errore può essere risolto unendo user_order_facts a tutte le esplorazioni in cui è unito anche users. In questo modo, le esplorazioni possono accedere a user_order_facts.lifetime_orders quando users.lifetime_orders viene utilizzato in una query.

Puoi utilizzare il riquadro dei metadati nell'IDE per visualizzare tutte le esplorazioni che utilizzano la visualizzazione users.

Il seguente esempio unisce le visualizzazioni mancanti:

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

Ora, se esegui di nuovo il validatore LookML, questo errore non dovrebbe essere visualizzato.

Escludi dall'esplorazione il campo che causa l'errore

Potresti non voler unire la visualizzazione user_order_facts a tutte le esplorazioni in cui è unito users. Ad esempio, potresti non voler consentire agli utenti di accedere ai campi dalla visualizzazione user_order_facts nell'Explore orders, ma vuoi che accedano ai campi dalla visualizzazione users senza errori. Puoi farlo escludendo il campo che causa l'errore, ovvero users.lifetime_orders, dall'esplorazione orders utilizzando il parametro fields.

Il parametro fields per le esplorazioni consente di includere o escludere campi specifici da un'esplorazione. In questo caso, puoi escludere il campo users.lifetime_orders da orders in questo modo:

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