Erro: campo desconhecido ou inacessível

Quando você estiver trabalhando nos arquivos LookML e estiver satisfeito com as atualizações, a próxima etapa para implantar as mudanças do LookML é executar o LookML Validator.

Ocasionalmente, você poderá ver um erro como este:

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

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

Por que esse erro ocorre?

Estes são alguns dos motivos para o erro:

  1. O campo que você está consultando não existe.
  2. O campo que você está referenciando é um grupo de dimensões inteiro, por exemplo, um grupo de dimensões é referenciado sem um timeframe anexado.
  3. O campo não está acessível por algumas explorações porque falta uma mescla.

Opção 1: o campo não existe

Se o campo user_order_facts.lifetime_orders for referenciado nos campos LookML, mas não existir como um campo, você receberá o erro unknown or inaccessible field.

Para resolver o erro, adicione o campo que está acionando o erro (neste exemplo, user_order_facts.lifetime_orders) à visualização que contém o campo em questão. Nesse caso, verifique se o campo está definido na visualização user_order_facts. Se ele não existir, será possível adicioná-lo.

Opção 2: o campo faz referência a um grupo de dimensões inteiro

Os grupos de dimensões representam um grupo de dimensões. Os grupos de dimensões type: time representam um grupo de dimensões de período definidas no parâmetro timeframe. Ao fazer referência a grupos de dimensões no LookML, é necessário anexar a dimensão apropriada, timeframe, neste caso, 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 ;;
  }

Caso queira fazer referência ao grupo de dimensões created em outro campo LookML, faça referência a uma dimensão timeframe específica no grupo, como uma das seguintes:

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

Se você tentar usar apenas o nome do grupo de dimensões (${created}), o Looker não saberá a que período você se refere e gerará o erro.

Opção 3: falta uma mesclagem

Veja a seguir a definição de LookML users.lifetime_orders:

  dimension: lifetime_orders {
    type: number
    sql: ${user_order_facts.lifetime_orders};;
  }
Observe o uso dos operadores de substituição ${} para fazer referência ao campo LookML user_order_facts.lifetime_orders.

A dimensão lifetime_orders na visualização users faz referência ao campo lifetime_orders na visualização user_order_facts. Nesse caso, o erro é acionado porque há instâncias no arquivo de modelo em que a visualização users é mesclada a uma exploração sem que a user_order_facts também tenha sido mesclada.

Para ver quais explorações estão causando o problema, expanda as ocorrências destacadas na mensagem de erro:

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

Essas ocorrências mostram que as explorações order_items e orders no modelo ecommerce estão causando o erro. Essas explorações têm muitas mesclagens e são definidas abaixo no arquivo 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 ambos os exploradores, a visualização users é mesclada sem participar da visualização user_order_facts. Assim, nenhum deles pode acessar o campo user_order_facts.lifetime_orders. Se você tentasse consultar o campo do users.lifetime_orders, que faz referência à user_order_facts.lifetime_orders, em "Explorar", qualquer erro seria acionado.

O validador LookML está avisando que os usuários receberão o erro quando consultarem users_order_facts.lifetime_orders. O campo users.lifetime_orders não acionará o erro em uma exploração em que user_order_facts também será incluído.

Por exemplo, considere a exploração users:

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

Aqui, user_order_facts é unido, portanto, consultar users.lifetime_orders não acionará um erro.

Como corrigir o erro causado por uma mesclagem ausente?

Se o erro for causado por uma mesclagem ausente, é possível corrigir isso de duas maneiras:

  1. Mesclar a visualização ausente em todos os casos. Para o exemplo usado neste artigo, confira se a visualização user_order_facts é mesclada sempre que a visualização users é mesclada em uma exploração.
  2. Exclua o campo que causa o erro de "explores" se você não quiser mesclar a visualização ausente.

Participar da visualização ausente

No exemplo anterior, o erro pode ser resolvido mesclando o user_order_facts em todos os "explores" em que users também é incluído. Isso garante que os exploradores possam acessar o user_order_facts.lifetime_orders quando o users.lifetime_orders for usado em uma consulta.

Use o painel de metadados no ambiente de desenvolvimento integrado para ver todas as explorações que usam a visualização users.

O exemplo a seguir mescla as visualizações ausentes:

  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 você executar novamente o validador LookML, esse erro não aparecerá.

Exclua o campo que está causando o erro em "explores".

Talvez você não queira participar da visualização user_order_facts para todos os usuários em que users está participando. Por exemplo, talvez você não queira que os usuários acessem os campos da visualização user_order_facts em orders Explorar, mas não quer que os usuários acessem os campos da visualização users sem erro. Para isso, exclua o campo que causa o erro (users.lifetime_orders) no recurso Explorar orders usando o parâmetro fields.

Com o parâmetro fields, você pode incluir ou excluir campos específicos de uma exploração. Nesse caso, é possível excluir users.lifetime_orders da exploração de orders desta forma:

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