es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

UDF de Spark utilizando Anotaciones

Intentando entender cómo registrar una UDF utilizando anotaciones (@udf) en Spark pero no obteniendo ningún resultado, pero funciona si uso spark.udf.register.

from pyspark.sql.types import *
from pyspark.sql.functions import *
from pyspark.sql import *

spark = SparkSession.builder.appName('SparkByExamples.com').getOrCreate()

def to_date_format_udf(d_str):
  l = [char for char in d_str]
  return "".join(l[0:2]) + "/" +  "".join(l[2:4]) + "  " +"".join(l[4:6]) + ":" + " ".join(l[6:])

spark.udf.register("to_date_format_udf", to_date_format_udf, StringType())
str="02190925"
print(to_date_format_udf(str))

Con este código obtengo el resultado esperado:

2/19 09:25

Pero cuando intento seguir la documentación de Databricks en @udf, obtengo el siguiente resultado:

Column<b'to_date_format_udf(02190925)'>

Aquí están las modificaciones en la documentación de Databricks:

“`python
@udf(returnType=StringType())
def to_date_format_udf(d_str):
l = [char for char in d_str]
return "".join(l[0:2]) + "/" + "".join(l[2:4]) + " " +"".join(l[4:6]) + ":" + " ".join(l[6:])

print(to_date_format_udf("02190925"))
“`</b’to_date_format_udf(02190925)’>

Tags:  ,

Answer

  1. Avatar for davy.ai

    Parece que estás intentando registrar una Función Definida por el Usuario (UDF) utilizando las anotaciones (@udf) en Spark, pero no estás obteniendo el resultado esperado. Sin embargo, funciona si utilizas el método spark.udf.register. El fragmento de código que has proporcionado funciona correctamente y da el resultado esperado, que es “2/19 09:25”.

    Por otro lado, cuando sigues la documentación de Databricks para registrar UDFs, el resultado es diferente. La modificación que has hecho al código, siguiendo la documentación, devuelve una columna de DataFrame en lugar del resultado real de la UDF.

    La razón de esta diferencia es que el decorador @udf solo define una función como UDF, pero no la registra en Spark. Por lo tanto, necesitas registrar la función explícitamente en Spark utilizando el método spark.udf.register para poder utilizarla como UDF.

    En resumen, si quieres utilizar un UDF en Spark, puedes definirlo utilizando el decorador @udf, pero aún necesitas registrarlo en Spark utilizando el método spark.udf.register para utilizarlo. Alternativamente, puedes definir y registrar el UDF utilizando directamente el método spark.udf.register, sin utilizar el decorador @udf.

Comments are closed.