来自 SparkSession 的 udf 和来自 pyspark.sql.functions 的 udf 有什么区别

what is the difference between udf from SparkSession and udf from pyspark.sql.functions

我有两种在pyspark中使用udf的方法:

1.

spark = pyspark.sql.SparkSession.builder.getOrCreate()
print(spark.udf)
output:
<pyspark.sql.udf.UDFRegistration at 0x7f5532f823a0>
from pyspark.sql.functions import udf
print(udf)
output:
<function pyspark.sql.functions.udf(f=None, returnType=StringType)>

我不明白两者之间的预期区别是什么。我怀疑为什么有两个 API 可用。spark.udf 有一个名为 register 的方法可用。我认为注册一个 udf 是必要的。那么,为什么它在pyspark.sql.functions中不可用。为什么只有第一种情况需要它?

能帮我解开这些疑惑吗?

spark.udf.register 用于注册要在 Spark SQL 查询中调用的 UDF。而 pyspark.sql.functions.udf 用于创建在使用 DataFrame API 时调用的 UDF。

注册 UDF 并与 SQL
一起使用
from pyspark.sql.types import LongType

df = spark.range(1, 5)
df.createOrReplaceTempView("tb")

def plus_one(v):
    return v + 1

spark.udf.register("plus_one_udf", plus_one, LongType())

spark.sql("select id, plus_one_udf(id) as id2 from tb").show()
#+---+---+
#| id|id2|
#+---+---+
#|  1|  2|
#|  2|  3|
#|  3|  4|
#|  4|  5|
#+---+---+
与 DataFrame 一起使用 API
import pyspark.sql.functions as F

plus_one_udf = F.udf(plus_one, LongType())

df.withColumn("id2", plus_one_udf(F.col("id"))).show()

#+---+---+
#| id|id2|
#+---+---+
#|  1|  2|
#|  2|  3|
#|  3|  4|
#|  4|  5|
#+---+---+