Publicado: 19 de septiembre de 2023
por Xinyi Yu, Wenchen Fan y Gengliang Wang
Nos complace presentar la compatibilidad con una nueva característica de SQL en Apache Spark y Databricks: Lateral Column Alias (LCA). Esta característica simplifica las consultas SQL complejas al permitir a los usuarios reutilizar una expresión especificada anteriormente en la misma lista SELECT, eliminando la necesidad de usar subconsultas anidadas y Common Table Expressions (CTEs) en muchos casos. Esta entrada de blog analiza los casos de uso de la característica y los beneficios que aporta a los usuarios de Spark y Databricks.
Lateral Column Alias (LCA) proporciona a los usuarios la capacidad de reutilizar una expresión especificada anteriormente dentro de la misma lista SELECT.
Esta característica se puede entender mejor a través del ejemplo que se proporciona a continuación. Aquí hay una consulta simple:
En ausencia de compatibilidad con LCA, los usuarios recibirán un error en esta consulta indicando que la 'a' posterior en la lista SELECT no se puede resolver:
[UNRESOLVED_COLUMN.WITHOUT_SUGGESTION] No se puede resolver una columna o parámetro de función con el nombre `a`. ; línea 1 pos 15;
Afortunadamente, con la característica LCA, esta segunda 'a' en la consulta ahora se identifica correctamente como el alias definido previamente en la misma lista SELECT: 1 AS a. Los usuarios ya no se enfrentan a un error, sino que obtienen los siguientes resultados:
Si bien los ejemplos anteriores muestran el concepto básico de LCA, el verdadero poder de esta característica radica en su capacidad para eliminar subconsultas y CTEs complejas.
Antes de la introducción de LCA, los usuarios tenían que lidiar con múltiples subconsultas y CTEs al intentar hacer referencia a cualquier atributo definido por un alias anterior. Esto aumentó la complejidad y la verbosidad de las consultas SQL, lo que las hizo difíciles de leer, escribir y mantener. En contraste, la compatibilidad con LCA simplifica fundamentalmente estas consultas, haciéndolas más fáciles de usar y administrar.
Tomemos un ejemplo. Supongamos que existe una tabla products que almacena información de productos como nombre, categoría, precio y calificación del cliente. Nuestro objetivo es calcular un precio ajustado basado en varios factores influyentes. El escenario delineará claramente cómo LCA puede convertir una consulta complicada en una versión significativamente simplificada.
Aquí está la estructura de la tabla:
Nos gustaría calcular el precio ajustado para cada producto según el mayor valor de dos factores: el porcentaje de aumento de precio basado en la calificación de los usuarios del producto y basado en el rango del producto dentro de su categoría. Sin compatibilidad con LCA, la consulta se ve así:
La lógica contiene muchas operaciones de encadenamiento en las que un cálculo posterior depende de resultados calculados previamente. Por lo tanto, requiere múltiples CTEs para almacenar cada cálculo intermedio de una manera adecuada para referencias posteriores en las etapas subsiguientes de la consulta.
Sin embargo, con LCA, es posible expresar la consulta como una sola instrucción SELECT:
¡Los LCA también se pueden encadenar! Esto significa que la expresión de alias actual, a la que pueden hacer referencia expresiones posteriores, puede hacer referencia a un alias lateral definido previamente. Por ejemplo, la definición de final_increase_percentage depende de dos alias de columna lateral: increase_percentage_based_on_rating y increase_percentage_based_on_rank. El siguiente cálculo de adjusted_price se refiere entonces a final_increase_percentage. Este poder de encadenamiento de LCA permite a los usuarios crear una serie de cálculos dependientes, donde los resultados de un cálculo se utilizan como entradas para el siguiente.
Como podemos ver en el ejemplo anterior, LCA simplifica en gran medida la consulta, eliminando cálculos repetidos o la necesidad de múltiples CTEs, lo que facilita su comprensión, mantenimiento y depuración. También mejora la legibilidad, ya que la definición del cálculo y su uso están cerca en la consulta.
Casi cualquier expresión puede residir dentro de un alias de columna lateral. Los ejemplos de la última sección muestran que las expresiones CASE-WHEN complejas, así como las expresiones GREATEST o incluso las funciones de ventana, pueden incluirse en un alias de columna lateral para su uso posterior en expresiones subsiguientes.
Por la misma razón, también podemos anidar expresiones de agregación de esta manera. Aquí hay un ejemplo en la misma tabla products:
LCA también funciona bien con tipos de datos complejos como struct, array y map. Por ejemplo,
LCA garantiza que las expresiones no deterministas se evalúen solo una vez, lo que refleja la semántica de "ejecutar una vez" que ofrecen las CTEs. Esto garantiza resultados consistentes al usar expresiones no deterministas en la consulta.
Por ejemplo, considere un escenario en el que existe un member_price para cada producto en la tabla products anterior. Nos gustaría aplicar un porcentaje de descuento aleatorio entre el 0% y el 5% a cada producto y luego calcular el precio con descuento tanto del price como del member_price. Este ejercicio debería garantizar que el porcentaje de descuento aplicado a ambos precios siga siendo el mismo.
Con LCA, podemos escribir:
En este ejemplo, Databricks calcula la discounted_rate una vez, y este valor permanece igual en todas las referencias posteriores, incluido el cálculo de adjusted_price y adjusted_member_price.
Por otro lado, si simplemente estamos copiando expresiones no deterministas, este comportamiento no se aplica porque evaluaría cada expresión por separado, lo que provocaría tasas de descuento inconsistentes para los dos precios:
En resumen, Lateral Column Alias (LCA) es una característica potente que simplifica significativamente las consultas SQL al permitir a los usuarios definir un alias con nombre sobre un árbol de expresiones y luego hacer referencia a este alias más adelante dentro de la misma cláusula SELECT.
LCA está completamente disponible y habilitado por defecto en Databricks Runtime 12.2 LTS y posteriores, en Databricks SQL 2023.20 y versiones superiores, y Apache Spark 3.4.
(Esta entrada del blog ha sido traducida utilizando herramientas basadas en inteligencia artificial) Publicación original
