Noções básicas do LookML

Esta página aborda padrões mais comuns no LookML.

Como rotular campos (e nomes na UI)

O Looker converte nomes de campo do LookML nas strings exibidas na UI, combinando o nome da visualização em fonte de espessura normal com o nome curto do campo em negrito. Por exemplo, um campo chamado Amount na visualização Orders seria exibido na UI como Orders. Nessa página, ambos ficam em negrito, e o nome da visualização fica em maiúscula (VALOR PEDIDOS) para deixar a discussão mais clara.

Se você quiser que um campo seja nomeado de forma diferente do nome da coluna em uma tabela, basta alterar o nome do campo e declarar sua 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
  }
}

Renomearemos 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 as contagens por uma dimensão

É muito fácil agrupar por uma dimensão e contar entidades. Agrupar por USERS Country, ORDERS Count informará de onde seus pedidos estão vindo de acordo com o país. No entanto, muitas vezes é útil criar uma contagem filtrada por algum valor dimensional. Por exemplo, você pode criar 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 conte os usuários da UE, 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"]
}

Para filtrar com uma expressão matemática, coloque-a 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 principais de desempenho são expressos na forma de porcentagens, como "porcentagem de itens retornados", "porcentagem de e-mails que resultaram em uma venda" ou outras ocorrências de "porcentagem de X em 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 números 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 erros.

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

Como usar conjuntos para detalhes de detalhamento

Um dos recursos mais eficientes do Looker é a capacidade de detalhar os dados para ver as entidades subjacentes 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 específica de campos de detalhamento para mostrar quando o valor da medida foi 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 teria esta aparência:

USERS EstadoContagem de pedidos
Califórnia24
Texas5
Colorado4
Flórida4
Illinois4

Se clicarmos em 24 na linha Califórnia, o comportamento esperado seria ver os 24 pedidos da Califórnia.

O Looker processa a adição do filtro Estado de usuários: Califórnia, mas ele não sabe quais campos você quer exibir no pedido. Você precisará usar um conjunto para declarar esses campos no 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 exibir ao detalhar uma contagem ou outra medida
  • Para importar ao participar de uma visualização
  • São indexados em uma guia Explorar

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

Conjuntos de literais

A forma mais simples de um conjunto é um conjunto literal. Um conjunto literal é criado simplesmente declarando-o como uma matriz. É possível declarar conjuntos 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 mostrar são id, name e city.

Na medida, podemos simplesmente declarar uma matriz literal.

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

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

Conjuntos nomeados

Suponha que temos duas contagens: Contagem de clientes e Contagem de clientes na Califórnia. Ao detalhar qualquer uma dessas contagens, queremos mostrar os campos id, name e city. Se declararmos os campos literalmente, podemos:

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 campo customers.state), teríamos que editar as duas listas. Em vez disso, o LookML oferece uma maneira de criar conjuntos nomeados que podemos manter em um lugar e usar em outros.

O código a seguir cria um conjunto customers.detail e aponta as contagens 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 redeclaração de conjuntos é aditiva. Se você declarar um conjunto em vários lugares, o Looker incluirá todos os campos que foram declarados para ele em todos os locais.
  • Você pode incorporar conjuntos em outros conjuntos digitando o nome do outro conjunto, seguido por 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

Como personalizar visualizações de detalhamento

Se o administrador do Looker tiver ativado o recurso Análise visual do Labs, as visualizações de detalhamento "Olhar e Explorar" nem sempre terão como padrão uma tabela de dados. Nesse caso, é possível personalizar a visualização exibida usando variáveis líquidas no parâmetro link, conforme mostrado na página de documentação do parâmetro link e na página de práticas recomendadas de perfuração de dados mais eficiente.

Painéis são compatíveis com perfuração visual usando o parâmetro link sem precisar ativar o recurso Perfuração visual do Labs.

Como filtrar conjuntos de resultados

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

always_filter em "Explorar"

Use always_filter para sempre aplicar um conjunto de filtros a qualquer consulta executada em uma exploração. Os filtros vão aparecer na IU do Looker e, embora os usuários possam mudar o valor padrão, eles não poderão removê-los. Geralmente, esses filtros são usados para remover dados que você normalmente não deseja incluir. Por exemplo, suponha que, na exploração Pedidos, desejamos ver apenas os pedidos que foram concluídos ou pendentes. Podemos adicionar:

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

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

sql_always_where em "Explorar"

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

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

# 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 em "Explorar"

Tabelas muito grandes exigem reflexão durante a consulta, já que consultas ilimitadas podem rapidamente se tornar muito 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 vai mudar a consulta se o usuário tiver aplicado um filtro em um ou mais destes campos: created_date, shipped_time, shipped_date, orders.id ou customer.name. Se o usuário não tiver filtrado nenhum desses campos, o Looker adicionará automaticamente um filtro de um dia em orders.created_time.

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