Errore: campo sconosciuto o inaccessibile

Quando lavori sui file LookML e sei soddisfatto dei tuoi aggiornamenti, il passaggio successivo per eseguire il deployment delle modifiche LookML consiste nell'eseguire lo strumento di convalida LookML per eseguire una convalida completa del modello.

A volte 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 visualizzazione 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 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 un gruppo di dimensioni a cui viene fatto riferimento senza un valore aggiuntotimeframe.
  3. Il campo non è accessibile da alcune esplorazioni perché manca un join.

Opzione 1: il campo non esiste

Se il campo user_order_facts.lifetime_orders viene fatto riferimento 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 caso user_order_facts.lifetime_orders, alla visualizzazione che contiene il campo in questione. In questo caso, assicurati che il campo sia definito nella vista user_order_facts. Se non esiste, puoi aggiungerla.

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 del periodo di tempo definite nel parametro timeframe. Quando fai riferimento ai gruppi di dimensioni in LookML, devi accodare 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:

  • 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.

Opzione 3: 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 user_order_facts.lifetime_orders di LookML.

La dimensione lifetime_orders nella vista users fa riferimento al campo lifetime_orders nella vista user_order_facts. In questo caso, l'errore si verifica 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 viste, le righe di codice delle viste ed 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 stanno causando l'errore. Queste esplorazioni hanno molti join e sono definite nel seguente modo 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 anche dalla vista user_order_facts; pertanto, nessuna delle due esplorazioni può accedere al campo user_order_facts.lifetime_orders. Se provi a eseguire una query sul campo users.lifetime_orders, che fa riferimento a user_order_facts.lifetime_orders, in entrambe le esplorazioni, attiveresti 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, prendi in considerazione l'esplorazione users:

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

In questo caso user_order_facts è unito, quindi la query su users.lifetime_orders non attiverà un errore.

Come faccio a correggere l'errore quando è causato da una join mancante?

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

  1. Partecipa alla visualizzazione mancante in tutte le richieste. Per l'esempio utilizzato in questa pagina, assicurati che la vista user_order_facts venga unita ovunque venga unita la vista users in un'esplorazione.
  2. Escludi il campo che causa l'errore dalle esplorazioni se non vuoi partecipare 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 è unito anche users. In questo modo, le esplorazioni potranno accedere a user_order_facts.lifetime_orders quando users.lifetime_orders viene utilizzato in una query.

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

L'esempio seguente 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}
    }
  }

Ora, se esegui di nuovo lo strumento di convalida LookML, questo errore non dovrebbe essere visualizzato.

Escludi il campo che causa l'errore dalle esplorazioni

Potresti non voler partecipare alla visualizzazione user_order_facts a tutte le esplorazioni a cui partecipa users. Ad esempio, forse non vuoi che gli utenti accedano ai campi dalla vista user_order_facts nell'esplorazione orders, ma vuoi che gli utenti accedano ai campi dalla vista users senza errori. Per farlo, escludi il campo che causa l'errore (users.lifetime_orders) dall'esplorazione 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 orders in questo 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}
    }
  }