PySpark siempre ha proporcionado excelentes API de SQL y Python para consultar datos. A partir de Databricks Runtime 15.2 y Apache Spark 4.0, las consultas parametrizadas admiten formas seguras y expresivas de consultar datos con SQL utilizando paradigmas de programación Pythonic.
Esta publicación explica cómo realizar consultas parametrizadas con PySpark y cuándo este es un buen patrón de diseño para su código.
Los parámetros son útiles para hacer que su código Spark sea más fácil de reutilizar y probar. También fomentan buenas prácticas de codificación. Esta publicación demostrará las dos formas diferentes de parametrizar consultas PySpark:
Veamos cómo usar ambos tipos de consultas parametrizadas PySpark y exploremos por qué la funcionalidad integrada es mejor que otras alternativas.
Las consultas parametrizadas fomentan el patrón "no te repitas" (DRY), facilitan las pruebas unitarias y hacen que el SQL sea más fácil de reutilizar. También previenen ataques de inyección SQL, que pueden representar vulnerabilidades de seguridad.
Puede ser tentador copiar y pegar grandes fragmentos de SQL al escribir consultas similares. Las consultas parametrizadas fomentan la abstracción de patrones y la escritura de código con el patrón DRY.
Las consultas parametrizadas también son más fáciles de probar. Puede parametrizar una consulta para que sea fácil de ejecutar en conjuntos de datos de producción y de prueba.
Por otro lado, parametrizar manualmente las consultas SQL con f-strings de Python es una alternativa deficiente. Considere las siguientes desventajas:
Veamos cómo parametrizar consultas con marcadores de parámetros, que protegen su código contra vulnerabilidades de inyección SQL y admiten la conversión automática de tipos de instancias comunes de PySpark en formato de cadena.
Suponga que tiene la siguiente tabla de datos llamada h20_1e9 con nueve columnas:
Le gustaría parametrizar la siguiente consulta SQL:
Le gustaría que fuera fácil ejecutar esta consulta con diferentes valores de id1. Aquí se explica cómo parametrizar y ejecutar la consulta con diferentes valores de id1.
Ahora vuelva a ejecutar la consulta con otro argumento:
El formateador de cadenas PySpark también le permite ejecutar consultas SQL directamente en un DataFrame sin definir explícitamente vistas temporales.
Suponga que tiene el siguiente DataFrame llamado person_df:
Aquí se explica cómo consultar el DataFrame con SQL.
¡Ejecutar consultas en un DataFrame usando sintaxis SQL sin tener que registrar manualmente una vista temporal es muy bueno!
Ahora veamos cómo parametrizar consultas con argumentos en marcadores de parámetros.
También puede usar un diccionario de argumentos para formular una consulta SQL parametrizada con marcadores de parámetros.
Suponga que tiene la siguiente vista llamada some_purchases:
Aquí se explica cómo realizar una consulta parametrizada con marcadores de parámetros con nombre para calcular el monto total gastado en un artículo determinado.
Calcule el monto total gastado en calcetines.
También puede parametrizar consultas con marcadores de parámetros sin nombre; consulte aquí para obtener más información.
Apache Spark sanitiza los marcadores de parámetros, por lo que este enfoque de parametrización también lo protege de ataques de inyección SQL.
Aquí hay una descripción general de cómo Spark sanitiza las consultas SQL parametrizadas con nombre:
Como se mencionó anteriormente, hay dos tipos de consultas parametrizadas admitidas en PySpark:
La sintaxis {} realiza una sustitución de cadena en la consulta SQL en el lado del cliente para facilitar su uso y mejorar la programabilidad. Sin embargo, no protege contra ataques de inyección SQL, ya que el texto de la consulta se sustituye antes de enviarse al servidor Spark.
La parametrización utiliza el argumento args de la API sql() y pasa el texto SQL y los parámetros por separado al servidor. El texto SQL se analiza con los marcadores de parámetros, sustituyendo los valores de los parámetros especificados en args en el árbol de consulta analizado.
Hay dos variantes de consultas parametrizadas del lado del servidor: marcadores de parámetros con nombre y marcadores de parámetros sin nombre. Los marcadores de parámetros con nombre utilizan la sintaxis :<nombre_param> para los marcadores de posición. Consulte la documentación para obtener más información sobre cómo usar marcadores de parámetros sin nombre.
También puede usar la interpolación de cadenas de Python normal para parametrizar consultas, pero no es tan conveniente.
Así es como tendríamos que parametrizar nuestra consulta anterior con f-strings de Python:
Esto no es tan bueno por las siguientes razones:
En resumen, las capacidades integradas de parametrización de consultas son más seguras y efectivas que la interpolación de cadenas.
Las consultas parametrizadas de PySpark te brindan nuevas capacidades para escribir código limpio con la sintaxis familiar de SQL. Son convenientes cuando deseas consultar un Spark DataFrame con SQL. Te permiten usar tipos de datos comunes de Python como valores de punto flotante, cadenas, fechas y horas, que se convierten automáticamente en valores SQL internamente. De esta manera, ahora puedes aprovechar los modismos comunes de Python y escribir código elegante.
Comienza a aprovechar las consultas parametrizadas de PySpark hoy mismo y disfrutarás inmediatamente de los beneficios de una base de código de mayor calidad.
Esta función está oficialmente soportada a partir de DBR 15.2.
(Esta entrada del blog ha sido traducida utilizando herramientas basadas en inteligencia artificial) Publicación original
