Errore: campo sconosciuto o inaccessibile

Quando lavori sui file LookML e gli aggiornamenti ti soddisfano, il passaggio successivo per eseguire il deployment delle modifiche LookML consiste nell'eseguire lo strumento di convalida LookML per eseguire la convalida completa del modello.

Di tanto in tanto, potresti visualizzare un errore simile al 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 vista users. L'errore indica che users.lifetime_orders non può accedere al campo user_order_facts.lifetime_orders a cui fa riferimento.

Perché si verifica questo errore?

Questo errore può verificarsi per alcuni 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 timeframe aggiunto.
  3. Il campo non è accessibile per alcune esplorazioni perché manca un join.

Opzione 1: il campo non esiste

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

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

Opzione 2: 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 di periodi di tempo definite nel parametro timeframe. Quando fai riferimento ai gruppi di dimensioni in LookML, devi aggiungere la dimensione appropriata (in questo caso timeframe) 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 opzioni:

  • 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 fai riferimento e genererà l'errore.

Opzione 3: manca un join

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

  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 vista users fa riferimento al campo lifetime_orders nella vista user_order_facts. In questo caso, l'errore viene attivato perché nel file del modello esistono istanze in cui la vista users è unita a un'esplorazione senza che anche user_order_facts sia stato unito.

Per vedere quali esplorazioni sono la causa del problema, puoi espandere le occorrenze evidenziate nel messaggio di errore:

Messaggio di errore espanso che mostra le visualizzazioni, le righe di codice delle visualizzazioni ed esplora due cause: users:79 (ecommerce:order_items) e users:79 (ecommerce:orders).

Queste occorrenze mostrano che l'errore è causato dalle esplorazioni order_items e orders nel modello ecommerce. Queste esplorazioni hanno molti join e sono definite 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 le esplorazioni, la vista users è unita senza unire anche la vista user_order_facts; pertanto, nessuna delle due esplorazioni può accedere al campo user_order_facts.lifetime_orders. Se provassi a eseguire query sul campo users.lifetime_orders, che fa riferimento a user_order_facts.lifetime_orders, in una delle due esplorazioni, attiverai l'errore.

Lo strumento di convalida 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 è unito, quindi l'esecuzione di query su users.lifetime_orders non genererà un errore.

Come posso correggere l'errore se è causato da un join mancante?

Se l'errore è causato da un join mancante, puoi correggerlo in due modi:

  1. Unisci la visualizzazione mancante in tutti i casi. Per l'esempio utilizzato in questa pagina, assicurati che la vista user_order_facts sia unita ogni volta che la vista users è unita in un'esplorazione.
  2. Escludi il campo che causa l'errore da Esplora se non vuoi unirti alla vista mancante.

Unisciti alla visualizzazione mancante

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

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

Il seguente esempio unisce le viste 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}
    }
  }

Se esegui nuovamente lo strumento di convalida LookML, questo errore non dovrebbe apparire.

Escludi dalle esplorazioni il campo che causa l'errore

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

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

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