Princípios básicos do LookML

Nesta página, abordamos padrões mais comuns no LookML.

Como rotular campos (e nomes na IU)

O Looker converte nomes de campos do LookML nas strings exibidas na IU, combinando o nome da visualização em fonte de tamanho normal com o nome curto do campo em negrito. Por exemplo, um campo chamado Valor na visualização Pedidos apareceria na IU como Valor. Nessa página, as duas estão em negrito, e o nome da visualização está em maiúsculo (ORDERS Amount) para deixar a discussão mais clara.

Se você quiser que um campo seja nomeado de maneira diferente do nome da coluna em uma tabela, basta mudar o nome do campo e declarar a vinculação sql:. No exemplo abaixo, há uma tabela airports com uma coluna cntrl_twr. O Looker gera a seguinte declaração:

view: airports {
  dimension: cntrl_twr {        # full name: airports.cntrl_twr
    type: yesno                 # default name: AIRPORT Cntrl Twr (Yes/No)
    sql: ${TABLE}.cntrl_twr ;;  # the sql expression for this field
  }
}

Renomeamos a dimensão cntrl_twr como legível.

view: airports {
  dimension: has_control_tower {  # full name: airports.has_control_tower
    type: yesno                   # aliased name: AIRPORTS Has Control Tower (Yes/No)
    sql: ${TABLE}.cntrl_twr ;;    # the sql expression for this field
  }
}

Como filtrar contagens por uma dimensão

É muito fácil agrupar por uma dimensão e contar entidades. Agrupar por USERS Country ou ORDERS Count informará a origem dos seus pedidos por país. No entanto, geralmente é útil criar uma contagem filtrada por um valor dimensional. Por exemplo, você pode fazer uma nova medida ORDERS France Count:

view: users {
  dimension: country {}
}
view: orders {
  dimension: id {
    primary_key: yes
    sql: ${TABLE}.id ;;
  }
  measure: count {
    type: count
    drill_fields: [detail]
  }
  measure: france_count {
    type: count   # COUNT(CASE WHEN users.country = 'France' THEN 1 ELSE NULL END)
    filters: [users.country: "France"]
  }
}

Os filtros podem usar qualquer expressão. Se você quiser um campo que contabiliza os usuários da União Europeia, use algo como:

measure: eu_count {
  type: count   # COUNT(CASE WHEN users.countrycode IN 'UK','FR','ES' THEN 1 ELSE NULL END)
  drill_fields: [detail]
  filters: [users.countrycode: "UK,FR,ES"]
}

Se você quiser filtrar com uma expressão matemática, inclua ela entre aspas duplas:

measure: total_orders_above_100_dollars {
  type: sum   # SUM(CASE WHEN order.value > 100 THEN order.value ELSE NULL END)
  sql: ${order.value} ;;
  drill_fields: [detail]
  filters: [order.value: ">100"]
}

Porcentagens

Muitos indicadores importantes de desempenho são expressos na forma de porcentagens, como "%" dos itens retornados, "quot; a porcentagem de e-mails que resultaram em uma venda" ou outras instâncias de "quot;a porcentagem de X que Y". No LookML, o padrão de design é criar contagens para as duas condições e criar um terceiro campo que calcule a porcentagem entre as duas.

dimension: returned {
  type: yesno
}
measure: count {   # total count of items
  type: count_distinct
  sql: ${TABLE}.id ;;
  drill_fields: [detail]
}
measure: returned_count {   # count of returned items
  type: count_distinct
  sql: ${TABLE}.id ;;
  drill_fields: [detail]
  filters: [returned: "Yes"]
}
measure: percent_returned {
  type: number
  sql: 100.0 * ${returned_count} / NULLIF(${count}, 0) ;;
  value_format: "0.00"
}

Use o formulário abaixo ao calcular porcentagens. No Postgres, as contagens são números inteiros, e a divisão entre inteiros resulta em números inteiros. Multiplicar por 100,0 converte a primeira contagem em um número de ponto flutuante, convertendo o restante da expressão em um flutuante. Para evitar erros de divisão por zero, o NULLIF(value, 0) converte um valor zero em nulo, tornando o resultado nulo e evitando um erro.

100.0 * ${returned_count} / NULLIF(${count}, 0)

Uso de conjuntos para detalhes de detalhamento

Um dos recursos mais eficientes do Looker é a capacidade de detalhar os dados para ver as entidades que compõem uma contagem ou outra medida.

Quando uma medida é clicada na IU do Looker, uma nova consulta é criada para localizar o conjunto de dados que a contém. Cada valor de cada dimensão na linha da tabela é adicionado aos filtros atuais.

Para mostrar os detalhes, o Looker precisa de uma lista especificada de campos de detalhamento para mostrar quando o valor da medição for clicado. Quando você gera um modelo, o gerador normalmente cria alguns campos de detalhamento iniciais para você. Além disso, é possível adicionar campos de detalhamento. Por exemplo, suponha que estamos medindo ORDERS Count por USERS State na última semana. No Looker, a consulta seria parecida com esta:

Estado dos USUÁRIOSContagem de PEDIDOS
Califórnia24
Texas5
Colorado4
Flórida4
Illinois4

Se clicarmos em 24 na linha Califórnia, o comportamento esperado é que vemos os 24 pedidos provenientes da Califórnia.

O Looker lida com a adição do filtro USERS State: California, mas o Looker não sabe quais campos você quer mostrar no pedido. Você precisará usar um conjunto para declarar esses campos no seu modelo.

No LookML, um set é uma lista de nomes de campo (dimensão, medida e filtro). Os conjuntos são usados para informar ao Looker quais campos:

  • você quer ver ao analisar uma contagem ou outra medida
  • Importar ao participar de uma visualização
  • são indexados em um Explorar;

É possível usar o mesmo conjunto em vários lugares em um modelo. Portanto, o Looker oferece várias maneiras de criar conjuntos.

Conjuntos literais

A forma mais simples de um conjunto é um conjunto literal. Para criar um conjunto literal, basta declarar o conjunto como uma matriz. Você pode declarar conjuntos de literais usando '[]'.

Veja este exemplo:

view: customers {
  dimension: id {
    primary_key: yes
  }
  measure: count {
    type: count
  }
  dimension: city {}
  dimension: state {}
  dimension: name {}
}

Os campos que queremos exibir são id, name e city.

Na medida, podemos simplesmente declarar uma matriz literal.

measure: count {
  type: count
  drill_fields: [id, name, city]
}

No caso de conjuntos que são usados apenas uma vez, a declaração literalmente é simples e fácil de entender.

Conjuntos nomeados

Suponha que haja duas contagens: Customer Count e CUSTOMERs in California Count. Quando detalharmos uma dessas contagens, gostaríamos de mostrar os campos id, name e city. Se declararmos os campos literalmente, poderemos:

view: customers {
  measure: count {
    type: count
    drill_fields: [id, name, city]
  }
  measure: in_california_count {
    type: count
    filters: [state: "California"]
  }
}

Se quiséssemos adicionar um novo campo (por exemplo, o customers.state), seria necessário editar as duas listas. Em vez disso, o LookML oferece uma maneira de criar conjuntos nomeados, que podemos manter em um só lugar e usar em vários lugares.

O código abaixo cria um conjunto customers.detail e aponta ambos para o mesmo conjunto de campos.

view: customers {
  set: detail {
    fields: [id, name, city]      # creates named set customers.detail
  }

  measure: count {
    type: count
    drill_fields: [detail*]       # show fields in the set "customers.detail"
  }
  measure: in_california_count {
    type: count
    filters: [state: "California"]
  }
}

Os conjuntos LookML são muito eficientes:

  • A declaração de conjuntos é complementar: se você declarar um conjunto em vários locais, o Looker incluirá todos os campos que foram declarados para o conjunto em todos os locais.
  • Para incorporar conjuntos em outros conjuntos, digite o nome do outro conjunto e um asterisco, como setname*.
  • Também é possível remover elementos de conjuntos colocando um hífen antes do nome do campo, como -fieldname.

Leia a referência de conjuntos completos

Personalizar visualizações de detalhamento

Se o administrador do Looker tiver ativado o recurso de laboratórios de perfuração visual, as visualizações de relatório nem sempre serão padrão em uma tabela de dados. Nesse caso, você pode personalizar a visualização exibida usando variáveis líquidas no parâmetro link, como mostrado na página de documentação do parâmetro link e no artigo da Central de Ajuda Mais perfuração de dados avançada.

A nova experiência do painel é compatível com a perfuração visual usando o parâmetro link sem a necessidade de ativar o recurso de Laboratórios de perfuração visual.

Como filtrar conjuntos de resultados

LookML fornece um conjunto de operações de filtro que podem ser aplicadas a campos e "explores" para filtrar conjuntos de resultados antes que sejam retornados ao usuário.

always_filter na guia "Explorar"

Use always_filter para sempre aplicar um conjunto de filtros a qualquer consulta executada em "Explorar". Os filtros vão aparecer na IU do Looker e, embora os usuários possam mudar o valor do filtro padrão que você fornece, não podem remover os filtros. Geralmente, esses filtros são usados para remover dados que você normalmente não quer incluir. Por exemplo, no Explorar Pedidos, só queríamos ver os pedidos concluídos ou pendentes. Podemos adicionar:

explore: orders {
  view_name: order
    filters: [status: "complete,pending"]
  }
}

Se o usuário quiser ver pedidos com outros valores de status, ele pode definir Status dos pedidos como % na IU.

sql_always_where na guia "Explorar"

Se você quiser aplicar uma restrição de consulta que não possa ser alterada pelos usuários, use sql_always_where. Além das consultas realizadas por usuários humanos, a restrição será aplicada a painéis, aparências programadas e informações incorporadas que dependem dessa exploração. Uma condição sql_always_where não é exibida para o usuário, a menos que ele consulte o SQL subjacente de qualquer consulta criada por ele.

O exemplo a seguir impede que os usuários vejam pedidos antes de 2012-01-01:

# Using Looker references
explore: order {
  sql_always_where: ${created_date} >= '2012-01-01' ;;
}

# Using raw SQL
explore: order {
  sql_always_where: DATE(created_time) >= '2012-01-01' ;;
}

conditionally_filter na guia "Explorar"

Tabelas muito grandes exigem certa reflexão ao realizar consultas, já que consultas ilimitadas podem se tornar rapidamente trabalhosas no banco de dados. O LookML oferece uma maneira de resolver isso na forma de conditionally_filter.

Use o parâmetro conditionally_filter para aplicar um filtro à consulta, a menos que o usuário já tenha adicionado um filtro para um dos campos listados na seção unless.

O exemplo a seguir não fará nenhuma alteração na consulta do usuário se ele aplicar um filtro em um ou mais desses campos: created_date, shipped_time, shipped_date, orders.id ou customer.name. Se o usuário não filtrar nenhum desses campos, o Looker adicionará automaticamente um filtro de 1 dia em orders.created_time.

  filters: [orders.created_time: "1 day"]
  unless: [created_date, shipped_time, shipped_date, orders.id, customer.name]
}