使用注释的 Spark UDF

Spark UDF using Annotations

试图了解如何在 spark 中使用注释 (@udf) 注册 udf 但没有得到任何结果,但如果我使用 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))

使用这段代码我得到了预期的结果:

2/19  09:25

但是当我尝试关注@udf 上的 databricks 文档时

我得到以下结果:

Column<b'to_date_format_udf(02190925)'>

这里是对数据块文档的修改:

@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"))

在第一种情况下,结果是预期的输出,因为输入直接应用于函数 UDF 根本没有被调用,调用被视为正常的 python 调用。

然而,注解 @udf also generally known as decorators 修改了 to_date_format_udf 的行为,导致它成为 return 一个表达式,在执行操作时将由 Spark 计算。

在两种情况下调用 spark.sql('select to_date_format_udf("02190925")').show() 会产生相同的结果。