Creación y Uso de Funciones UDF en Apache Spark

Clase 18 de 25Curso de Databricks: Arquitectura Delta Lake

Contenido del curso

Administración y Gestion de la Plataforma de Databricks

Implementacion de un Delta Lake en Databricks

Resumen

Definir funciones personalizadas que se ejecuten de forma paralela en todos los nodos de un clúster es una de las capacidades más potentes que ofrece Apache Spark. Las UDF (User Defined Functions) permiten exactamente eso: escribir lógica propia en el lenguaje de programación que prefieras y registrarla dentro de Spark para que opere de manera distribuida sobre grandes volúmenes de datos.

¿Qué son las UDF y por qué usarlas en Spark?

Spark incluye funciones nativas como map, filter y flatMap para realizar transformaciones sobre los datos. Sin embargo, existen escenarios donde necesitamos lógica que Spark no ofrece de forma nativa. Ahí es donde entran las UDF [01:03].

Una UDF es, en esencia, una función convencional de cualquier lenguaje de programación. La diferencia fundamental radica en que, al registrarla dentro de Apache Spark, esa función adquiere la capacidad de ejecutarse de manera distribuida en todos los nodos del clúster. Esa es su característica distintiva.

Es importante considerar que Spark se integra con diferentes lenguajes. Si trabajas con Python, la UDF se define en Python. Si trabajas con Scala o R, el código debe ser del lenguaje correspondiente [03:00]. La API que utilices determina el lenguaje en el que escribes la función.

¿Cómo se crea una UDF paso a paso en PySpark?

El proceso se divide en tres etapas claras: crear un DataFrame, definir la función y registrarla como UDF.

¿Cómo preparar los datos de trabajo?

Primero se crea un DataFrame utilizando createDataFrame, pasando un conjunto de datos de prueba y definiendo las columnas: ID, nombre, departamento y salario [01:40]. Al ejecutar .show(), los datos se visualizan en formato tabular de filas y columnas.

¿Cómo definir la lógica de la función?

Se define una función estándar en Python con la palabra reservada def [03:25]. En el ejemplo práctico, la función recibe el salario como parámetro y clasifica a cada persona según su nivel salarial:

  • Si el salario es mayor a 5000: se asigna high salary.
  • Si el salario es mayor a 2000: se asigna medium salary.
  • Si el salario es mayor a 0: se asigna low salary.
  • En cualquier otro caso: se marca como inválido.

La función retorna la variable level, que solo puede tomar esos cuatro valores de tipo texto [04:55]. Hasta este punto, no se ha hecho nada relacionado con UDF; es simplemente una función Python convencional.

¿Cómo registrar y aplicar la UDF en Spark?

Para convertir esa función en UDF se utiliza el método de registro, donde se especifican dos elementos clave [06:05]:

  • El nombre de la función previamente definida.
  • El tipo de dato de retorno, que en este caso es StringType porque la variable level devuelve cadenas de texto.

Como buena práctica, se antepone la palabra UDF al nombre de la función registrada, por ejemplo udf_salary_level, lo que facilita identificar rápidamente que se trata de una función distribuida [06:50].

Para aplicarla, se agrega una nueva columna al DataFrame llamada nivel de salario utilizando withColumn. Dentro de esa operación se invoca la UDF pasándole la columna salary como parámetro [07:20].

¿Qué resultados se obtienen al ejecutar la UDF?

Al ejecutar el código y visualizar el DataFrame resultante, la clasificación funciona correctamente [08:00]:

  • Un salario de 1000 dólares se clasifica como low salary.
  • Un salario de 3500 dólares aparece como medium salary.
  • Personas que ganan por encima de 5000 dólares reciben la etiqueta de high salary.

Esto demuestra cómo una función personalizada, que Spark no podría ofrecer de forma nativa, se ejecuta de manera paralela y distribuida sobre cada fila del DataFrame. Se pueden crear tantas UDF como el contexto lo requiera, adaptando la lógica y el tipo de retorno según la necesidad.

Si ya pusiste en práctica tu propia UDF, comparte en los comentarios los resultados y los retos que resolviste.

      Creación y Uso de Funciones UDF en Apache Spark