Ir para o conteúdo principal

Introdução ao Suporte de Alias de Coluna Lateral

Um Novo Recurso SQL para Simplificar Suas Consultas

Engineering blog

Publicado: 19 de setembro de 2023

Data Warehousing7 min de leitura

Estamos animados em apresentar o suporte a um novo recurso SQL no Apache Spark e Databricks: Lateral Column Alias (LCA). Este recurso simplifica consultas SQL complexas, permitindo que os usuários reutilizem uma expressão especificada anteriormente na mesma lista SELECT, eliminando a necessidade de usar subconsultas aninhadas e Common Table Expressions (CTEs) em muitos casos. Este post do blog discute os casos de uso do recurso e os benefícios que ele traz para usuários do Spark e Databricks.

O que é o Suporte a Lateral Column Alias?

Lateral Column Alias (LCA) oferece aos usuários a capacidade de reutilizar uma expressão especificada anteriormente dentro da mesma lista SELECT.
Este recurso pode ser melhor compreendido através do exemplo fornecido abaixo. Aqui está uma consulta simples:

Na ausência do suporte a LCA, os usuários receberão um erro nesta consulta, indicando que o último a na lista SELECT não pode ser resolvido:

 

[UNRESOLVED_COLUMN.WITHOUT_SUGGESTION] Uma coluna ou parâmetro de função com o nome `a` não pode ser resolvido. ; linha 1 pos 15;

 

Felizmente, com o recurso LCA, este segundo a na consulta agora identifica com sucesso o alias previamente definido na mesma lista SELECT: 1 AS a. Os usuários não enfrentam mais um erro, mas sim obtêm os seguintes resultados:

Elimine Subconsultas Complexas e CTEs com Encadeamento de LCA

Embora os exemplos anteriores demonstrem o conceito básico de LCA, o verdadeiro poder deste recurso reside em sua capacidade de eliminar subconsultas e CTEs complexas.

Antes da introdução do LCA, os usuários precisavam lidar com múltiplas subconsultas e CTEs ao tentar referenciar qualquer atributo definido por um alias anterior. Isso aumentava a complexidade e a verbosidade das consultas SQL, tornando-as difíceis de ler, escrever e manter. Em contraste, o suporte a LCA simplifica fundamentalmente essas consultas, tornando-as mais amigáveis e gerenciáveis.

Vamos pegar um exemplo. Suponha que exista uma tabela products armazenando informações de produtos como nome, categoria, preço e avaliação do cliente. Nosso objetivo é calcular um preço ajustado com base em vários fatores influentes. O cenário delineará claramente como o LCA pode transformar uma consulta complicada em uma versão significativamente simplificada.

Aqui está a estrutura da tabela:

Gostaríamos de calcular o preço ajustado para cada produto com base no maior valor de dois fatores: o percentual de aumento de preço com base na avaliação dos usuários do produto e com base na classificação do produto dentro de sua categoria. Sem o suporte LCA, a consulta fica assim:

A lógica contém muitas operações de encadeamento onde um cálculo posterior depende de resultados calculados anteriormente. Portanto, requer múltiplas CTEs para armazenar cada cálculo intermediário de forma adequada para referências posteriores nas etapas subsequentes da consulta.

No entanto, com LCA, é possível expressar a consulta em uma única instrução SELECT:

LCAs também podem ser encadeados! Isso significa que a expressão de alias atual, que pode ser referenciada por expressões subsequentes, pode referenciar um alias lateral previamente definido. Por exemplo, a definição de final_increase_percentage depende de dois aliases de coluna laterais: increase_percentage_based_on_rating e increase_percentage_based_on_rank. O cálculo subsequente de adjusted_price então se refere a final_increase_percentage. Esse poder de encadeamento do LCA permite que os usuários criem uma série de cálculos dependentes, onde os resultados de um cálculo são usados como entradas para o próximo.

Como podemos ver no exemplo acima, o LCA simplifica muito a consulta, eliminando cálculos repetidos ou a necessidade de múltiplas CTEs, tornando-a mais fácil de entender, manter e depurar. Também melhora a legibilidade, pois a definição do cálculo e o uso estão próximos na consulta.

GUIA

Data warehousing no lakehouse

LCA em Tudo

Expressões Simples, de Agregação ou de Janela

Quase toda expressão pode residir dentro de um alias de coluna lateral. Os exemplos na última seção mostram que expressões CASE-WHEN complexas, bem como expressões de função GREATEST ou até mesmo funções de janela, podem existir dentro de um alias de coluna lateral para uso posterior em expressões subsequentes.

Da mesma forma, também podemos aninhar expressões de agregação dessa maneira. Aqui está um exemplo na mesma tabela products:

Tipos de Dados Complexos

O LCA também funciona bem com tipos de dados complexos como struct, array e map. Por exemplo,

Expressões Não Determinísticas

O LCA garante que expressões não determinísticas sejam avaliadas apenas uma vez, espelhando a semântica de "execução única" que as CTEs oferecem. Isso garante resultados consistentes ao usar expressões não determinísticas na consulta.

Por exemplo, considere um cenário onde existe um member_price para cada produto na tabela products acima. Gostaríamos de aplicar um percentual de desconto aleatório entre 0% e 5% a cada produto e, em seguida, calcular o preço com desconto tanto do price quanto do member_price. Este exercício deve garantir que o percentual de desconto aplicado a ambos os preços permaneça o mesmo.

Com LCA, podemos escrever:

Neste exemplo, o Databricks calcula a discounted_rate uma vez, e esse valor permanece o mesmo em todas as referências subsequentes, incluindo o cálculo de adjusted_price e adjusted_member_price.

Por outro lado, se estivermos simplesmente copiando expressões não determinísticas, esse comportamento não se aplica porque avaliaria cada expressão separadamente, causando taxas de desconto inconsistentes para os dois preços:

Experimente o LCA!

Em resumo, Lateral Column Alias (LCA) é um recurso poderoso que simplifica significativamente as consultas SQL, permitindo que os usuários definam um alias nomeado sobre uma árvore de expressões e, em seguida, referenciem esse alias posteriormente na mesma cláusula SELECT.

  • Isso evita a repetição das mesmas expressões várias vezes ou a necessidade de subconsultas ou CTEs, gerando em vez disso consultas SELECT concisas e legíveis.
  • É compatível com todos os tipos de expressões e tipos de dados complexos. A sintaxe SQL suporta o encadeamento desses aliases para maior flexibilidade também.
  • Garante que cada expressão não determinística seja avaliada apenas uma vez, permitindo assim resultados consistentes em várias referências.

O LCA está totalmente disponível e habilitado por padrão no Databricks Runtime 12.2 LTS e posteriores, no Databricks SQL 2023.20 e acima, e no Apache Spark 3.4.

Leia Mais

  • Ordem de resolução
    Leitores curiosos podem se interessar pela ordem de resolução de nomes em consultas SQL com a introdução do LCA. Este documento de resolução de nomes do Databricks define um conjunto claro de regras ordenadas e exemplos concretos para resolver referências, incluindo o papel do LCA neste processo.

(Esta publicação no blog foi traduzida utilizando ferramentas baseadas em inteligência artificial) Publicação original

Nunca perca uma postagem da Databricks

Inscreva-se nas categorias de seu interesse e receba as últimas postagens na sua caixa de entrada