Aprimoramentos do LookML

Visão geral

Com os refinamentos do LookML, você pode adaptar uma visualização ou Explorar sem editar o arquivo do LookML que a contém. Isso é ideal para:

Por exemplo, se você tiver o seguinte arquivo de visualização no projeto:

view: flights {
  sql_table_name: flightstats.accidents ;;

  dimension: id {
    label: "id"
    primary_key: yes
    type: number
    sql: ${TABLE}.id ;;
  }
}

É possível refinar a visualização flights, conforme mostrado no exemplo a seguir: use o parâmetro view com o mesmo nome da visualização, mas adicione um sinal de adição (+) antes do nome para indicar que é um refinamento de uma visualização existente.

Esse refinamento adiciona uma dimensão air_carrier à visualização flights:

view: +flights {
  dimension: air_carrier {
    type: string
    sql: ${TABLE}.air_carrier ;;
  }
 }

Esse refinamento pode ser colocado em qualquer arquivo do LookML no projeto, como um arquivo de modelo, de visualização ou no próprio arquivo do LookML. Consulte a seção Como usar refinamentos no seu projeto do LookML para saber como funciona.

O refinamento combinado com o LookML original tem o resultado final como se fosse o LookML original para a visualização:

view: flights {
  sql_table_name: flightstats.accidents ;;

  dimension: id {
    label: "id"
    primary_key: yes
    type: number
    sql: ${TABLE}.id ;;
  }

  dimension: air_carrier {
    type: string
    sql: ${TABLE}.air_carrier ;;
  }
}

Na interface do Looker, os usuários vão encontrar a dimensão Transportadora aérea, como se você tivesse adicionado a dimensão ao arquivo de visualização original.

Consulte a seção Exemplo para mais informações detalhadas sobre a implementação.

Refinamentos em comparação com extensões

O Looker também oferece suporte à extensão de objetos LookML. A extensão é útil quando você quer criar uma nova cópia de uma visualização ou análise detalhada para adicionar novos objetos. Por exemplo, você pode criar uma visualização base que define todos os campos e, em seguida, criar várias novas visualizações que estendem a visualização base. Essas novas visualizações podem ser modificadas para ocultar determinados campos na visualização de base ou para alterar definições ou rótulos dos campos da visualização de base.

Os refinamentos são úteis quando você quer modificar uma visualização ou uma seção "Explorar" existente com alguns ajustes ou ajustes em determinados objetos, mas não quer criar cópias da visualização ou da seção "Explorar". Os refinamentos são ideais para situações em que você não pode ou não quer modificar a visualização básica ou a Análise detalhada e para situações em que a criação de uma nova visualização ou Análise detalhada exigiria mudanças extensas em outras referências do LookML. Consulte a seção Exemplo nesta página para conferir um exemplo desse caso de uso.

Na maioria dos casos de uso, os refinamentos são uma alternativa mais simples e limpa do que extends.

Os desenvolvedores avançados do LookML podem usar o parâmetro extends em um refinamento do LookML. Consulte a seção Os refinamentos podem conter extensões nesta página para mais informações.

Os refinamentos substituem a maioria dos parâmetros

É importante observar que, na maioria dos casos, um refinamento substitui as configurações originais de um objeto. No exemplo a seguir, a visualização original tem uma dimensão oculta (hidden: yes):

view: faa_flights {
  dimension: carrier {
    hidden: yes
  }
}

Em outro arquivo, há um refinamento para essa dimensão com hidden: no:


include: "/views/faa_flights.view.lkml"

view: +faa_flights {
  dimension: carrier {
    hidden: no
  }
}

O último refinamento tem precedência, então hidden: no é aplicado e a dimensão vai aparecer na visualização final.

Em alguns casos, os refinamentos são aditivos em vez de substituir. Consulte a seção Alguns parâmetros são aditivos desta página para mais informações.

Alguns parâmetros são aditivos

Em muitos casos, se o refinamento tiver o mesmo parâmetro do objeto que está sendo refinado, o refinamento vai substituir os valores de parâmetro do objeto refinado.

No entanto, os refinamentos podem ser aditivos para alguns parâmetros, o que significa que os valores do objeto base são usados em conjunto com os valores do objeto refinado.

Os parâmetros a seguir são aditivos:

Por exemplo, aqui está uma visualização com uma dimensão name e um parâmetro link:

view: carriers {
  sql_table_name: flightstats.carriers ;;

  dimension: name {
    sql: ${TABLE}.name ;;
    type: string
    link: {
      label: "Google {{ value }}"
      url: "http://www.google.com/search?q={{ value }}"
      icon_url: "http://google.com/favicon.ico"
    }
  }
}

E aqui está um refinamento da visualização carriers, com uma dimensão name que tem valores diferentes para o parâmetro link:


include: "/views/carriers.view.lkml"

view: +carriers {
  label: "Refined carriers"

  dimension: name {
    sql: ${TABLE}.name ;;
    type: string
    link: {
      label: "Dashboard for {{ value }}"
      url: "https://docsexamples.dev.looker.com/dashboards/307?Carrier={{ value }}"
      icon_url: "https://www.looker.com/favicon.ico"
    }
  }
}

Na visualização carriers refinada, os dois parâmetros link são aditivos, então a dimensão name vai mostrar os dois links.

Os refinamentos são aplicados em ordem

Um objeto pode ser refinado várias vezes e em vários lugares, o que permite que os desenvolvedores do Looker usem refinamentos de muitas maneiras criativas. Isso também significa que os desenvolvedores precisam prestar atenção à ordem em que os refinamentos são aplicados:

  • Em um projeto, os refinamentos são aplicados na ordem em que os arquivos são incluídos. Os refinamentos dos arquivos incluídos por último vão substituir os refinamentos dos arquivos incluídos anteriormente.
  • Em um único arquivo, os refinamentos são aplicados linha por linha, de cima para baixo. Os refinamentos com o número de linha mais alto são aplicados por último e vão substituir todos os refinamentos anteriores, se houver conflitos.

Por exemplo, no arquivo de visualização a seguir, há dois refinamentos da visualização faa_flights. O primeiro refinamento oculta uma dimensão (hidden: yes), e o segundo mostra a dimensão (hidden: no). Quando há conflitos como esse, o refinamento mais abaixo no arquivo tem precedência:

include: "//e_faa_original/views/faa_flights.view.lkml"

view: +faa_flights {
  dimension: carrier {
    hidden: yes
  }
}

view: +faa_flights {
  dimension: carrier {
    hidden: no
  }
}

A lógica é semelhante para incluir vários arquivos em um projeto: os refinamentos no último arquivo listado nos includes terão precedência. Por exemplo, se um arquivo de modelo incluir estes arquivos:

include: "/refinements/distance_analysis.lkml"
include: "/refinements/finishing_touches.lkml"

Os refinamentos no distance_analysis.lkml serão aplicados primeiro, e depois os refinamentos no arquivo finishing_touches.lkml. Se houver conflitos, os refinamentos no último arquivo, finishing_touches.lkml, terão precedência.

Como usar final: yes para evitar outros refinamentos

Como descrito anteriormente, o mesmo objeto pode ser refinado várias vezes em vários lugares, e o último refinamento vai substituir todos os refinamentos anteriores.

Se você quiser que um refinamento seja considerado o refinamento final da visualização ou da seção "Explorar", adicione a flag final: yes a ele. O ambiente de desenvolvimento integrado do Looker vai retornar um erro do LookML se houver refinamentos que serão aplicados após esse refinamento final ou se um desenvolvedor tentar adicionar um novo refinamento que será aplicado após esse refinamento final. Por exemplo, a segunda refinação neste arquivo de visualização criaria um erro do LookML porque a refinação anterior tem a flag final: yes:

include: "//e_faa_original/views/faa_flights.view.lkml"

view: +faa_flights {
  final: yes
  dimension: carrier {
    hidden: yes
  }
}

view: +faa_flights {
  dimension: carrier {
    hidden: no
  }
}

Adicionar a flag final: yes a um refinamento é uma boa maneira de verificar se os refinamentos estão sendo aplicados na ordem desejada.

Os refinamentos podem conter extensões

Os desenvolvedores avançados do LookML podem querer usar um parâmetro extends em um refinamento do LookML, que adiciona o objeto estendido ao objeto que está sendo refinado.

Para resumir o comportamento de extends e os refinamentos:

  • A extensão de um objeto cria uma nova cópia dele e depois se baseia nela. Por exemplo, você pode criar uma vista base que define todos os campos e, em seguida, criar várias novas vistas que estendem a vista base. Cada uma dessas novas visualizações vai incorporar uma cópia da visualização básica. A partir daí, o desenvolvedor pode adicionar campos, filtros ou outras propriedades diferentes para modificar o que está na visualização básica. A ideia é começar com um objeto base e usá-lo de maneiras diferentes em vários outros objetos. Acesse a página de documentação Como reutilizar o código com extends para uma discussão completa sobre como trabalhar com extends.
  • O refinamento de um objeto adiciona uma camada de modificações a ele, mas, ao contrário da extensão, o refinamento não faz várias cópias do objeto. A ideia é criar um objeto de base sem modificar o LookML original.

Como exemplo do uso padrão de refinamentos, confira uma Análise detalhada chamada orders e a Análise detalhada +orders que a refina:

explore: orders {
  view_name: orders
  # other Explore parameters
}

explore: +orders {
  label: "Orders Information"
  # other Explore parameters to build on the original Explore
}

Além disso, você pode adicionar um refinamento que inclui um extends. Confira o mesmo exemplo de análise detalhada orders. Além disso, há uma Análise básica chamada users_base, e agora o refinamento +orders tem um parâmetro extends que traz o users_base:


explore: users_base {
  view_name: users
  extension: required
  # other Explore parameters
}

explore: orders {
  view_name: orders
  # other Explore parameters
}

explore: +orders {
  label: "Orders Information"
  extends: [users_base]
  # other Explore parameters to build on the original Explore
}

O que é especial aqui é que o refinamento +orders tem um extends. O resultado é que a visualização +orders agora vai estender a guia users_base "Explorar".

Como o Looker implementa extends em refinamentos

Este é um conceito avançado do LookML. Antes de usar extends em um refinamento, você precisa entender bem o seguinte:

  • Como o Looker implementa extends: se um elemento do LookML for definido no objeto estendido e no objeto de extensão, a versão no objeto de extensão será usada, a menos que o parâmetro seja aditivo. Consulte a página de documentação Como reutilizar código com extends para saber mais.
  • Como o Looker implementa refinamentos: se um elemento do LookML for definido em vários refinamentos, o último refinamento vai substituir os anteriores. Consulte a seção Os refinamentos são aplicados em ordem nesta página para mais detalhes.

Por fim, você precisa entender como o Looker combina esses princípios para implementar extends usados nos refinamentos. Esta é a ordem que o Looker implementa, com cada etapa substituindo a anterior em caso de conflitos:

  1. Valores do extends especificado no objeto
  2. Valores do extends especificados nos refinamentos do objeto
  3. Valores do objeto
  4. Valores dos refinamentos do objeto

Para ilustrar, confira um exemplo que segue o valor do parâmetro label em cada etapa da implementação:

explore: orders_base {
  label: "Orders Base"
  view_name: orders
  extension: required
}

explore: users_base {
  label: "Users Base"
  view_name: users
  extension: required
}

explore: orders {
  label: "Orders"
  extends: [orders_base]
}

explore: +orders {
  label: "Orders Refined"
  extends: [users_base]
}

Confira como o Looker implementa o valor de label para a análise detalhada orders neste exemplo:

  1. Valores do extends especificado no objeto. Como a Análise orders tem um parâmetro extends, o Looker começa com os elementos do LookML do objeto que está sendo estendido, que, neste caso, é a Análise orders_base. Nesse ponto, o valor de label é "Orders Base".
  2. Valores do extends especificados nos refinamentos do objeto. Como orders tem um refinamento e o refinamento tem um parâmetro extends, o Looker aplica elementos do LookML da extensão do refinamento, que, neste caso, é a Análise users_base. Nesse ponto, o valor de label é "Base de usuários".
  3. Valores do objeto. Agora que todas as extensões foram tratadas, o Looker aplica elementos do objeto de extensão, que, neste caso, é o orders Explore. Se houver conflitos, o objeto de extensão vai prevalecer. Agora, o valor de label é "Orders".
  4. Valores dos refinamentos do objeto. Por fim, o Looker aplica elementos de qualquer refinamento da análise orders. Se houver conflitos, o objeto de refinamento vai prevalecer. Agora, o valor de label é "Orders Refined".

Os refinamentos extends são cumulativos

Conforme descrito na seção Parâmetros de substituição de refinamentos desta página, os refinamentos geralmente substituem as configurações originais de um objeto. Esse não é o caso do parâmetro extends. Quando extends é usado em um refinamento, o valor no parâmetro extends é anexado à lista de itens estendidos no objeto original ou em refinamentos anteriores, se houver. Se houver conflitos, a prioridade será dada ao último item na cadeia de extensões.

Por exemplo, aqui está uma Análise detalhada de base chamada orders_base e uma Análise detalhada orders que estende a base. Além disso, há uma análise detalhada users_base e o refinamento +orders que estende users_base:

explore: orders_base {
  view_name: orders
  extension: required
  # other Explore parameters
}

explore: users_base {
  view_name: users
  extension: required
  # other Explore parameters
}

explore: orders {
  extends: [orders_base]
  # other Explore parameters to build on the base Explore
}

explore: +orders {
  extends: [users_base]
  # other Explore parameters to build on the base Explores
}

A orders "Explorar" estende a orders_base, e os refinamentos +orders adicionam a users_base à lista extends. O resultado é que a Análise detalhada +orders vai estender orders_base e users_base, como se fosse o LookML original para a Análise detalhada:

explore: orders {
  extends: [orders_base, users_base]
}

Se houver conflitos, a prioridade será dada ao último item na cadeia de extensões. Neste exemplo, os elementos em users_base substituem qualquer elemento em conflito em orders_base.

O conceito de estender mais de um objeto por vez é discutido na página de documentação Reuso de código com extends.

Uma última observação: neste exemplo, a ordem dos parâmetros explore não importa. No entanto, em casos com vários refinamentos do mesmo objeto, a ordem dos refinamentos é importante. Conforme descrito na seção Os refinamentos são aplicados em ordem desta página, o último refinamento em um arquivo substitui os refinamentos anteriores.

Como usar refinamentos no seu projeto do LookML

Confira as etapas gerais para refinar visualizações e guias "Explorar" no seu projeto:

  1. Identifique a visualização ou a seção "Explorar" que você quer refinar.
  2. Decida onde você quer armazenar os refinamentos. É possível adicionar refinamentos em qualquer arquivo do LookML ou criar arquivos separados para eles. Consulte o procedimento para criar um arquivo de teste de dados na página de documentação Como entender outros arquivos de projeto para conferir um exemplo de criação de arquivos genéricos do LookML.
  3. Use o parâmetro include para incorporar os refinamentos ao modelo:
    • No arquivo em que você escreve os refinamentos, é necessário incluir os arquivos do LookML que você está refinando. O ambiente de desenvolvimento integrado do Looker vai emitir avisos se você tentar refinar um objeto que não está incluído.
    • No arquivo de modelo, inclua os arquivos em que os refinamentos são definidos. É possível combinar arquivos e usar inclusões de maneiras muito criativas. Consulte a seção Como usar refinamentos para adicionar camadas ao modelo nesta página para saber mais.

Exemplo

Refinar objetos do LookML é uma maneira fácil de adaptar visualizações e análises detalhadas sem precisar editar o LookML original. Isso é especialmente útil quando as visualizações e as análises detalhadas são somente leitura no projeto, como arquivos importados de outros projetos. Confira um exemplo de como refinar uma seção "Explorar".

Confira o LookML da análise detalhada aircraft:


explore: aircraft {
  join: aircraft_types {
    type: left_outer
    sql_on: ${aircraft.id} = ${aircraft_types.id} ;;
    relationship: many_to_one
  }

  join: aircraft_engine_types {
    type: left_outer
    sql_on: ${aircraft.id} = ${aircraft_engine_types.id} ;;
    relationship: many_to_one
  }
}

Essa análise detalhada contém várias visualizações, cada uma com muitas dimensões.

Agora, outro projeto do LookML chamado e_faa_refined importa o arquivo de Análises aircraft. No projeto e_faa_refined, você pode usar um refinamento para simplificar bastante a análise detalhada aircraft.

Como o aircraft Explore é um arquivo importado, não é possível editá-lo diretamente. Em vez disso, adicione um refinamento. Confira um exemplo de um arquivo separado chamado refinements.lkml que contém este LookML:

include: "//e_faa_original/Explores/aircraft.explore.lkml"

explore: +aircraft {
  label: "Aircraft Simplified"
  fields: [aircraft.aircraft_serial, aircraft.name, aircraft.count]
}

O arquivo refinements.lkml contém o seguinte:

  • O parâmetro include para trazer o arquivo aircraft.explore.lkml original do projeto importado. Consulte a página de documentação Importing files from other projects (em inglês) para saber como se referir a arquivos de projetos importados.
  • Refinamentos na página "Explorar" do aircraft:
    • O símbolo + antes do nome da Análise indica um refinamento de uma Análise existente.
    • O parâmetro label muda o rótulo da seção "Explorar" para "Aeronave simplificada".
    • O parâmetro fields especifica que apenas três campos serão mostrados na Análise.

O resultado final é como se fosse a visualização original de aircraft e aircraft:

explore: aircraft {
  label: "Aircraft Simplified"
  }

view: aircraft {
  sql_table_name: flightstats.aircraft ;;

  dimension: aircraft_serial {
    type: string
    sql: ${TABLE}.aircraft_serial ;;
  }

  dimension: name {
    type: string
    sql: ${TABLE}.name ;;
  }

  measure: count {
    type: count
  }
}

Para conferir um exemplo de como usar refinamentos para personalizar uma única visualização para vários casos de uso, consulte a receita do manual Maximizar a reutilização de código com o DRY LookML: personalizar uma única visualização de base para vários casos de uso.

Outros casos de uso para refinamentos

Como mencionado anteriormente, os refinamentos são ideais para adaptar objetos do LookML que são somente leitura, como blocos do Looker ou arquivos importados.

No entanto, depois de entender como adicionar refinamentos e incluí-los nos modelos, você poderá fazer coisas muito legais com seus projetos, conforme descrito nos exemplos a seguir.

Como usar refinamentos para adicionar análises

É possível usar refinamentos para adicionar análises ao modelo sem tocar nos arquivos originais do LookML. Por exemplo, se houver um projeto em que as visualizações e análises são geradas a partir de tabelas no seu banco de dados e armazenadas em um arquivo do LookML chamado faa_basic.lkml, você pode criar um arquivo faa_analysis.lkml em que usa refinamentos para adicionar análises. Confira um exemplo de uma nova tabela derivada chamada distance_stats que tem uma análise de distância. Este exemplo mostra refinamentos da Análise flights atual do arquivo faa_basic.lkml que combina a tabela derivada distance_stats com a Análise flights. Além disso, na parte de baixo do exemplo, a visualização flights é refinada para adicionar novos campos da análise:

include: "faa_basic.lkml"

explore: +flights {
  join: distance_stats {
    relationship: one_to_one
    type: cross
  }
}

view: distance_stats {
  derived_table: {
    explore_source: flights {
      bind_all_filters: yes
      column: distance_avg {field:flights.distance_avg}
      column: distance_stddev {field:flights.distance_stddev}
    }
  }
  dimension: avg {
    type:number
    sql: CAST(${TABLE}.distance_avg as INT64) ;;
  }
  dimension: stddev {
    type:number
    sql: CAST(${TABLE}.distance_stddev as INT64) ;;
  }
}
view: +flights {
  measure: distance_avg {
    type: average
    sql: ${distance} ;;
  }
  measure: distance_stddev {
    type: number
    sql: STDDEV(${distance}) ;;
  }
  dimension: distance_tiered2 {
    type: tier
    sql: ${distance} ;;
    tiers: [500,1300]
  }
}

Como usar refinamentos para adicionar camadas ao modelo

Outro caso de uso interessante para refinamentos é adicionar camadas ao seu projeto. Você pode criar vários arquivos de refinamento e incluí-los estrategicamente para adicionar camadas.

Por exemplo, no projeto FAA, há um arquivo faa_raw.lkml que contém todas as visualizações e análises detalhadas geradas a partir de tabelas no seu banco de dados. Esse arquivo tem uma visualização para cada tabela no banco de dados, cada uma com dimensões para cada coluna do banco de dados.

Além do arquivo bruto, você pode criar um arquivo faa_basic.lkml para adicionar uma nova camada com refinamentos básicos, como mesclar itens às suas análises detalhadas ou adicionar medidas às suas visualizações, como esta:

include: "faa_raw.lkml"

explore: +flights {
  join: carriers {
    sql_on: ${flights.carrier} = ${carriers.name} ;;
  }
}

view: +flights {
  measure: total_seats {
    type: sum
    sql: ${aircraft_models.seats} ;;
  }
}

Em seguida, adicione um arquivo faa_analysis.layer.lkml para adicionar uma nova camada com análises. Consulte a subseção Usar refinamentos para adicionar análises para conferir um exemplo de arquivo de análise.

Depois disso, basta incluir todos os arquivos de refinamento no arquivo do modelo. Também é possível usar o arquivo de modelo para adicionar refinamentos e apontar as visualizações para as tabelas de banco de dados que você quer referenciar:

connection: "publicdata_standard_sql"

include: "faa_raw.lkml"
include: "faa_basic.lkml"
include: "faa_analysis.lkml"

view: +flights {
  sql_table_name: lookerdata.faa.flights;;
}
view: +airports {
  sql_table_name: lookerdata.faa.airports;;
}
view: +aircraft {
  sql_table_name: lookerdata.faa.aircraft;;
}
view: +aircraft_models{
  sql_table_name: lookerdata.faa.aircraft_models;;
}
view: +carriers {
  sql_table_name: lookerdata.faa.carriers;;
}

Você pode duplicar esse arquivo de modelo e apontar para diferentes tabelas de banco de dados ou incluir diferentes arquivos de refinamento que você criou para definir outras camadas que quer no modelo.

Como usar refinamentos para TDPs

Conforme descrito na seção Refinamentos em comparação com extensões desta página, uma extensão cria uma nova cópia do objeto que está sendo estendido. No caso de tabelas derivadas persistentes (PDTs, na sigla em inglês), não use extensões, já que cada extensão de uma PDT cria uma nova cópia da tabela no seu banco de dados.

No entanto, é possível adicionar refinamentos à visualização da PDT, já que eles não criam uma nova cópia do objeto que está sendo refinado.

Como usar metadados para conferir refinamentos de um objeto

Clique em um parâmetro explore ou view no ambiente de desenvolvimento integrado do Looker e use o painel de metadados para conferir os refinamentos no objeto. Consulte a página de documentação Metadados para objetos do LookML para mais informações.

Informações importantes

Projetos com localização

Ao refinar um objeto, lembre-se de que as regras de localização também se aplicam aos seus refinamentos. Se você estiver refinando um objeto e definindo novos rótulos ou descrições, forneça definições de localização nos arquivos de strings de localidade do seu projeto. Consulte a página de documentação Como localizar seu modelo do LookML para mais informações.