Erro: campo desconhecido ou inacessível

Quando estiver a trabalhar nos seus ficheiros LookML e estiver satisfeito com as atualizações, o passo seguinte para implementar as alterações do LookML é executar o validador de LookML para fazer uma validação completa do modelo.

Ocasionalmente, pode ver um erro como o seguinte:

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

Neste exemplo, o erro refere-se ao campo lifetime_orders na visualização users. O erro indica que users.lifetime_orders não consegue aceder ao campo user_order_facts.lifetime_orders ao qual faz referência.

Árvore de depuração

Use a seguinte árvore de decisão para resolver problemas comuns do Liquid:

As secções seguintes descrevem os cenários na árvore mais detalhadamente.

Por que motivo ocorre este erro?

Existem alguns motivos pelos quais este erro pode ocorrer:

  1. O campo ao qual está a fazer referência não existe.
  2. O campo ao qual está a fazer referência é um grupo de dimensões completo, por exemplo, um grupo de dimensões é referenciado sem umtimeframe anexado.
  3. O campo é inacessível por algumas explorações porque existe uma junção em falta.

O campo não existe

Se o campo user_order_facts.lifetime_orders for referenciado em campos LookML, mas não existir como um campo em si, recebe o erro unknown or inaccessible field.

Pode resolver o erro adicionando o campo que está a acionar o erro (neste exemplo, user_order_facts.lifetime_orders) à vista que contém o campo em questão. Neste caso, pode certificar-se de que o campo está definido na vista user_order_facts. Se não existir, pode adicioná-lo.

O campo faz referência a um grupo de dimensões completo

Os grupos de dimensões representam um grupo de dimensões. Os grupos de dimensões type: time representam um grupo de dimensões do período que são definidas no parâmetro timeframe. Quando faz referência a grupos de dimensões no LookML, tem de anexar a dimensão adequada, neste caso, timeframe, ao nome do grupo de dimensões.

Por exemplo, considere o seguinte grupo de dimensões:

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

Se quiser fazer referência ao grupo de dimensões created noutro campo do LookML, tem de fazer referência a uma dimensão de intervalo de tempo específica no grupo, como uma das seguintes:

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

Se tentar usar apenas o nome do grupo de dimensões, ${created}, o Looker não sabe a que período se refere e gera o erro.

Existe uma junção em falta

Segue-se a definição do LookML de users.lifetime_orders:

  dimension: lifetime_orders {
    type: number
    sql: ${user_order_facts.lifetime_orders};;
  }
Tenha em atenção a utilização dos operadores de substituição ${} para fazer referência ao campo do LookML user_order_facts.lifetime_orders.

A dimensão lifetime_orders na vista users faz referência ao campo lifetime_orders da vista user_order_facts. Neste caso, o erro é acionado porque existem instâncias no ficheiro de modelo em que a vista users está associada a uma exploração sem que o conjunto de dados user_order_facts também tenha sido associado.

Para ver que análises detalhadas estão a causar o problema, pode expandir as ocorrências realçadas na mensagem de erro:

Mensagem de erro expandida que apresenta as visualizações, as linhas de código de visualização e as explorações de duas causas: users:79 (ecommerce:order_items) e users:79 (ecommerce:orders).

Estas ocorrências mostram que os elementos Explorar order_items e orders no modelo ecommerce estão a causar o erro. Estas explorações têm muitas junções e são definidas da seguinte forma no ficheiro do modelo:

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

Em ambas as opções Explorar, a vista users é unida sem unir também a vista user_order_facts. Como tal, nenhuma das opções Explorar pode aceder ao campo user_order_facts.lifetime_orders. Se tentasse consultar o campo users.lifetime_orders, que faz referência a user_order_facts.lifetime_orders, em qualquer uma das funções Explorar, acionaria o erro.

O validador de LookML está a avisá-lo de que os utilizadores vão receber o erro quando consultarem users_order_facts.lifetime_orders. O campo users.lifetime_orders não aciona o erro numa exploração à qual user_order_facts também está associado.

Por exemplo, considere o cartão users Explorar:

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

Aqui, user_order_facts is está associado, pelo que a consulta de users.lifetime_orders não aciona um erro.

Como posso corrigir o erro quando é causado por uma junção em falta?

Se o erro for causado por uma junção em falta, pode corrigi-lo de algumas formas:

  1. Junte a vista em falta em todos os casos. Para o exemplo usado ao longo desta página, certifique-se de que a visualização de propriedade user_order_facts é unida sempre que a visualização de propriedade users é unida numa exploração.
  2. Exclua o campo que está a causar o erro das explorações se não quiser juntar a vista em falta.

Junte-se à vista em falta

No exemplo anterior, o erro pode ser resolvido juntando user_order_facts a todas as explorações onde users também está associado. Isto garante que as explorações podem aceder a user_order_facts.lifetime_orders quando users.lifetime_orders é usado numa consulta.

Pode usar o painel de metadados no IDE para ver todas as análises detalhadas que usam a vista users.

O exemplo seguinte junta as visualizações em falta:

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

Agora, se executar novamente o validador do LookML, este erro não deve ser apresentado.

Exclua o campo que está a causar o erro das explorações

Pode não querer associar a vista user_order_facts a todas as opções Explorar onde users está associado. Por exemplo, talvez não queira que os utilizadores acedam aos campos da vista user_order_facts na vista orders Explorar, mas quer que os utilizadores acedam aos campos da vista users sem erro. Pode fazê-lo excluindo o campo que está a causar o erro, ou seja, users.lifetime_orders, da ordersExploração, usando o parâmetro fields.

O parâmetro fields para explorações permite-lhe incluir ou excluir campos específicos de uma exploração. Neste caso, pode excluir o campo users.lifetime_orders da opção orders Explorar semelhante a isto:

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