Ir al contenido principal

Presentación de SQL Scripting en Databricks, Parte 2

Una inmersión profunda en las construcciones de SQL Scripting y cómo usarlas

SQL Scripting Deep Dive OG

Publicado: 19 de mayo de 2025

Producto10 min de lectura

Summary

  • Presentar y explicar las características de SQL Scripting
  • Ejecutar condicionalmente y controlar el flujo dentro de SQL Scripts
  • Interceptar y manejar condiciones de error específicas

En la segunda parte de la serie de blogs sobre el anuncio de SQL Scripting, examinaremos la tarea administrativa que discutimos en la primera parte: cómo aplicar una regla insensible a mayúsculas y minúsculas a cada columna STRING en una tabla. Recorreremos ese ejemplo paso a paso, explicaremos las características utilizadas y lo ampliaremos más allá de una sola tabla para cubrir un esquema completo.

También puedes seguir el ejemplo en este notebook

Cambiar la intercalación de todos los campos de texto en todas las tablas de un esquema

Databricks admite una amplia gama de intercalaciones, sensibles al idioma, insensibles a mayúsculas y minúsculas y a acentos. Es fácil usar esta característica para tablas y columnas nuevas. Pero, ¿qué pasa si tienes un sistema existente que usa upper() o lower() en predicados en todas partes y quieres aprovechar las mejoras de rendimiento asociadas con una intercalación nativa insensible a mayúsculas y minúsculas mientras simplificas tus consultas? Eso requerirá algo de programación; ahora puedes hacerlo todo en SQL. 

Usemos el siguiente esquema de prueba: 

El orden se basa en los puntos de código ASCII, donde todas las letras mayúsculas preceden a todas las letras minúsculas. ¿Puedes arreglar esto sin agregar upper() o lower()?

Instrucciones SQL dinámicas y configuración de variables

Nuestro primer paso es indicarle a la tabla que cambie su intercalación predeterminada para las columnas que se agreguen en el futuro. Puedes alimentar tus variables locales con marcadores de parámetros, que el notebook detectará automáticamente y agregará widgets. También puedes usar EXECUTE IMMEDIATE para ejecutar una instrucción ALTER TABLE compuesta dinámicamente.

Cada script SQL consta de una instrucción compuesta BEGIN .. END. Las variables locales se definen primero dentro de una instrucción compuesta, seguida de la lógica.

Todo esto es solo un conjunto de instrucciones lineales. Hasta ahora, podrías escribir todo esto con variables de sesión SQL sin la instrucción compuesta. Tampoco has logrado mucho. Después de todo, querías cambiar la intercalación de las columnas existentes. Para hacer esto, necesitas:

  • Descubrir todas las columnas de cadena existentes en la tabla
  • Cambiar la intercalación de cada columna

En resumen, necesitas iterar sobre la tabla INFORMATION_SCHEMA.COLUMNS.

Bucles

SQL Scripting ofrece cuatro formas de bucles y maneras de controlar las iteraciones del bucle.

  1. LOOP … END LOOP;
    Este es un bucle "infinito".
    Este bucle continuará hasta que una excepción o un comando explícito ITERATE o LEAVE rompa el bucle.
    Discutiremos el manejo de excepciones más adelante y señalaremos la documentación de ITERATE y LEAVE que explica cómo controlar los bucles.
  2. WHILE predicate DO … END WHILE;
    Este bucle se ingresará y se volverá a ingresar siempre que la expresión del predicado se evalúe como verdadera o el bucle se rompa por una excepción, ITERATE o LEAVE.
  3. REPEAT … UNTIL predicate END REPEAT;
    A diferencia de WHILE, este bucle se ingresa al menos una vez y se reejecuta hasta que la expresión del predicado se evalúe como falsa o el bucle sea interrumpido por una excepción, LEAVE o un comando ITERATE.
  4. FOR query DO …. END FOR;
    Este bucle se ejecuta una vez por cada fila que la consulta devuelve, a menos que se salga temprano con una excepción, LEAVE o una instrucción ITERATE.

Ahora, aplica el bucle FOR a nuestro script de intercalación. La consulta obtiene los nombres de columna de todas las columnas de cadena de la tabla. El cuerpo del bucle altera la intercalación de cada columna por turno:


Verifiquemos que la tabla se ha actualizado correctamente:

Hasta ahora, todo bien. Nuestro código está funcionalmente completo, pero deberías indicarle a Delta que analice las columnas que modificaste para beneficiarte del salto de archivos. No quieres hacer esto por columna. Sino agruparlas todas y hacer el trabajo solo si hubo, de hecho, una columna de tipo string para la cual se alteró la intercalación. Decisiones, decisiones... 

GUÍA

Tu guía compacta para el análisis moderno

Lógica condicional

SQL Scripting ofrece tres formas de ejecutar sentencias SQL de forma condicional.

  1. Lógica if-then-else. La sintaxis para esto es sencilla:
    IF predicate THEN … ELSEIF predicate THEN … ELSE …. END IF;
    Naturalmente, puedes tener cualquier número de bloques ELSEIF opcionales, y el ELSE final también es opcional.
  2. Una simple sentencia CASE
    Esta sentencia es la versión de SQL Scripting de la expresión CASE simple.
    CASE expression WHEN option THEN … ELSE … END CASE;
    Se compara una ejecución única de una expresión con varias opciones, y la primera coincidencia decide qué conjunto de sentencias SQL se ejecutará. Si ninguna coincide, se ejecutará el bloque ELSE opcional.
  3. Una sentencia CASE buscada
    Esta sentencia es la versión de SQL Scripting de la expresión CASE buscada.
    CASE WHEN predicate THEN …. ELSE … END CASE;
    El bloque THEN se ejecuta para el primero de los predicados que se evalúen como verdaderos. Si ninguno coincide, se ejecuta el bloque ELSE opcional. 

Para nuestro script de intercalación, un simple IF THEN END IF será suficiente. También necesitas recopilar el conjunto de columnas a las que aplicar ANALYZE y algo de magia de funciones de orden superior para producir la lista de columnas:

Anidación

Lo que has escrito hasta ahora funciona para tablas individuales. ¿Qué pasa si quieres operar sobre todas las tablas de un esquema? SQL Scripting es totalmente componible. Puedes anidar sentencias compuestas, sentencias condicionales y bucles dentro de otras sentencias de SQL Scripting.

Así que lo que harás aquí es doble:

  1. Añade un bucle FOR externo para encontrar todas las tablas dentro de un esquema usando INFORMATION_SCHEMA.TABLES. Como parte de esto, necesitas reemplazar las referencias a la variable del nombre de la tabla con referencias a los resultados de la consulta del bucle FOR.
  2. Añade un compuesto anidado para mover la variable de la lista de columnas al bucle FOR externo. No puedes declarar una variable directamente en el cuerpo del bucle FOR; no añade un nuevo ámbito. Esto es principalmente una decisión relacionada con el estilo de codificación, pero tendrás una razón más seria para un nuevo ámbito.

Este error tiene sentido. Tienes varias formas de proceder:

  1. Filtra tipos de tabla no admitidos, como las vistas, en la consulta de information_schema. El problema es que hay numerosos tipos de tabla y ocasionalmente se añaden nuevos.
  2. Maneja las vistas. Esa es una gran idea. Llamemos a eso tu tarea para casa.
  3. Tolera la condición de error

Manejo de excepciones

Una capacidad clave de SQL Scripting es la habilidad de interceptar y manejar excepciones. Los manejadores de condiciones se definen en la sección de declaración de una sentencia compuesta y se aplican a cualquier sentencia dentro de esa sentencia compuesta, incluidas las anidadas. Puedes manejar condiciones de error específicas por nombre, SQLSTATEs específicos que manejan varias condiciones de error, o todas las condiciones de error. Dentro del cuerpo del manejador de condiciones, puedes usar la sentencia GET DIAGNOSTICS para recuperar información sobre la excepción que se está manejando y ejecutar cualquier script SQL que consideres apropiado, como registrar el error en un log o ejecutar una lógica alternativa a la que falló. Luego puedes SIGNAL una nueva condición de error, RESIGNAL la condición original, o simplemente salir de la sentencia compuesta donde se define el manejador y continuar con la siguiente sentencia.

En nuestro script, queremos omitir cualquier sentencia para la que la sentencia ALTER TABLE DEFAULT COLLATION no se aplicó y registrar el nombre del objeto.

Arriba, has desarrollado un script administrativo puramente en SQL. También puedes escribir scripts ELT y convertirlos en Jobs. SQL Scripting es una herramienta realmente potente que deberías aprovechar.  

Qué hacer a continuación

Ya seas un usuario existente de Databricks o estés migrando desde otro producto, SQL Scripting es una capacidad que deberías usar. SQL Scripting sigue el estándar ANSI y es totalmente compatible con OSS Apache Spark™. SQL Scripting se describe en detalle en SQL Scripting | Documentación de Databricks

También puedes usar este notebook para verlo tú mismo. 

(Esta entrada del blog ha sido traducida utilizando herramientas basadas en inteligencia artificial) Publicación original

No te pierdas ninguna publicación de Databricks.

Suscríbete a nuestro blog y recibe las últimas publicaciones en tu bandeja de entrada.