Combinar e otimizar dados

Concluído

As organizações geralmente agrupam tipos diferentes de informações de várias fontes. As informações são armazenadas em um grande número de tabelas. Ocasionalmente, talvez seja necessário unir as tabelas com base nas relações lógicas entre elas, para relatórios ou uma análise mais detalhada. No cenário da empresa de varejo, você usa tabelas para clientes, produtos e informações de vendas.

Neste módulo, você aprenderá sobre várias maneiras de combinar dados em consultas Kusto para fornecer aos membros da equipe as informações necessárias para aumentar a conscientização do produto e aumentar as vendas.

Entender seus dados

Antes de começar a escrever consultas que combinem informações das suas tabelas, você precisará entender os dados. Quando você trabalha com consultas Kusto, você deseja pensar em tabelas como amplamente pertencentes a uma de duas categorias:

  • Tabelas de fatos: tabelas cujos registros são fatos imutáveis, como a tabela SalesFact no cenário da empresa de varejo. Nessas tabelas, os registros são acrescentados progressivamente via streaming ou em partes grandes. Os registros permanecem na tabela até que sejam removidos, e nunca são atualizados.
  • Tabelas de dimensões: tabelas cujos registros são dimensões mutáveis, como as tabelas Customers e Products no cenário da empresa de varejo. Essas tabelas contêm dados de referência, como tabelas de pesquisa de um identificador de entidade para as respectivas propriedades. As tabelas de dimensões não são atualizadas regularmente com novos dados.

Em nosso cenário de empresa de varejo, você usa tabelas de dimensão para enriquecer a tabela SalesFact com informações adicionais ou para fornecer mais opções para filtrar os dados para consultas.

Você também deseja entender os volumes de dados com os quais está trabalhando e sua estrutura ou esquema (nomes e tipos de coluna). Execute as seguintes consultas para obter essas informações substituindo TABLE_NAME pelo nome da tabela que você está analisando:

  • Para obter o número de registros em uma tabela, use o operador count:

    TABLE_NAME
    | count
    
  • Para obter o esquema de uma tabela, use o operador getschema:

    TABLE_NAME
    | getschema
    

A execução dessas consultas nas tabelas de fatos e dimensões no cenário da empresa de varejo fornece informações como o seguinte exemplo:

Tabela Registros Esquema
SalesFact 2,832,193 - SalesAmount (real)
- TotalCost (real)
- DateKey (datetime)
- ProductKey (long)
- CustomerKey (long)
Clientes 18,484 - CityName (string)
- CompanyName (string)
- ContinentName (string)
- CustomerKey (long)
- Education (string)
- FirstName (string)
- Gender (string)
- LastName (string)
- MaritalStatus (string)
- Occupation (string)
- RegionCountryName (string)
- StateProvinceName (string)
Produtos 2,517 - ProductName (string)
- Manufacturer (string)
- ColorName (string)
- ClassName (string)
- ProductCategoryName (string)
- ProductSubcategoryName (string)
- ProductKey (long)

Na tabela, destacamos os identificadores exclusivos CustomerKey e ProductKey que são usados para combinar registros entre tabelas.

Entender consultas de várias tabelas

Depois de analisar seus dados, você precisa entender como combinar tabelas para fornecer as informações necessárias. As consultas do Kusto fornecem vários operadores que você pode usar para combinar dados de várias tabelas, incluindo os operadores lookup, join e union.

O operador join mescla as linhas das duas tabelas correspondendo valores das colunas especificadas de cada tabela. A tabela resultante depende do tipo de junção usado. Por exemplo, se você usar uma junção interna, a tabela terá as mesmas colunas que a tabela esquerda (às vezes chamada de tabela externa), além das colunas da tabela direita (às vezes chamada de tabela interna). Saiba mais sobre os tipos de junção na próxima seção. Para ter o melhor desempenho, se uma tabela sempre for menor do que a outra, use-a como o lado esquerdo do operador join.

O operador lookup é uma implementação especial de um operador join que otimiza o desempenho de consultas, em que uma tabela de fatos é enriquecida com os dados de uma tabela de dimensões. Ele estende a tabela de fatos com valores pesquisados em uma tabela de dimensões. Para obter o melhor desempenho, o sistema, por padrão, pressupõe que a tabela esquerda é a tabela maior (fatos) e a tabela direita é a tabela menor (dimensões). Essa suposição é exatamente o oposto da suposição usada pelo operador join.

O operador union retorna todas as linhas de duas ou mais tabelas. Ele é útil quando você deseja combinar dados de várias tabelas.

A função materialize() armazena em cache os resultados em uma execução de consulta para reutilização subsequente na consulta. É como tirar um instantâneo dos resultados de uma subconsulta e usá-lo várias vezes na consulta. Essa função é útil na otimização de consultas para cenários em que os resultados são:

  • São caros de calcular
  • Não determinísticos

Em breve, você aprenderá mais sobre os vários operadores de mesclagem de tabela e a função materialize() e como usá-los.

Tipos de junção

Diagram showing query join kinds.

Há muitos tipos diferentes de junções que podem ser executadas que afetam o esquema e as linhas na tabela resultante. A tabela a seguir mostra os tipos de junções compatíveis com a Linguagem de Consulta Kusto e o esquema e as linhas que eles retornam:

Tipo de junção Descrição Ilustração
innerunique (padrão) Junção interna com eliminação de duplicação no lado esquerdo
Esquema: todas as colunas de ambas as tabelas, incluindo as chaves correspondentes
Linhas: todas as linhas com eliminação de duplicação da tabela esquerda que correspondem a linhas da tabela direita
inner Junção interna padrão
Esquema: todas as colunas de ambas as tabelas, incluindo as chaves correspondentes
Linhas: somente linhas correspondentes das duas tabelas
leftouter Junção externa esquerda
Esquema: todas as colunas de ambas as tabelas, incluindo as chaves correspondentes
Linhas: todos os registros da tabela esquerda e apenas linhas correspondentes da tabela direita
rightouter Junção externa direita
Esquema: todas as colunas de ambas as tabelas, incluindo as chaves correspondentes
Linhas: todos os registros da tabela direita e apenas linhas correspondentes da tabela esquerda
fullouter Junção externa completa
Esquema: todas as colunas de ambas as tabelas, incluindo as chaves correspondentes
Linhas: todos os registros de ambas as tabelas com células não correspondentes preenchidas com nulo
leftsemi Semijunção à esquerda
Esquema: todas as colunas da tabela esquerda
Linhas: todos os registros da tabela esquerda que correspondem aos registros da tabela direita
leftanti, anti, leftantisemi Antijunção esquerda e semivariante
Esquema: todas as colunas da tabela esquerda
Linhas: todos os registros da tabela esquerda que não correspondem aos registros da tabela direita
rightsemi Semijunção à direita
Esquema: todas as colunas da tabela direita
Linhas: todos os registros da tabela direita que correspondem aos registros da tabela esquerda
rightanti, rightantisemi Antijunção direita e semivariante
Esquema: todas as colunas da tabela direita
Linhas: todos os registros da tabela esquerda que não correspondem aos registros da tabela esquerda

Observe que o tipo de junção padrão é innerunique e não precisa ser especificado. No entanto, é uma melhor prática sempre especificar explicitamente o tipo de junção para maior clareza.

À medida que você avança neste módulo, você também aprende sobre as funções de agregação arg_min() e arg_max(), o operador as como uma alternativa à instrução let e a função startofmonth() para ajudar no agrupamento de dados por mês.