试图理解如何在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)'>下面是对databricks文档的修改:
@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"))发布于 2021-12-03 20:38:40
在第一种情况下,结果是预期的输出,因为输入直接应用于函数UDF根本不被调用,调用被视为一个普通的python调用。
然而,注释@udf (通常也称为decorators )修改了to_date_format_udf的行为,从而使其返回一个表达式,该表达式将在执行某个操作时由火花计算。
在这两种情况下,调用spark.sql('select to_date_format_udf("02190925")').show()都会产生相同的结果。
https://stackoverflow.com/questions/70220094
复制相似问题