SparkSession 中的 udf 和 pyspark.sql.functions 中的 udf 有啥区别

Posted

技术标签:

【中文标题】SparkSession 中的 udf 和 pyspark.sql.functions 中的 udf 有啥区别【英文标题】:what is the difference between udf from SparkSession and udf from pyspark.sql.functionsSparkSession 中的 udf 和 pyspark.sql.functions 中的 udf 有什么区别 【发布时间】:2022-01-22 06:48:06 【问题描述】:

我有两种方法可以在 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 中没有。为什么只需要第一种情况?

你能帮我澄清这些疑惑吗?

【问题讨论】:

【参考方案1】:

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|
#+---+---+

【讨论】:

为什么只需要注册一个? @MiloMinderbinder “只有一个”是什么意思? 您只在一个 udf 上调用了 register:spark.udf.register("plus_one_udf", plus_one, LongType())。我想知道为什么 pyspark.sql.functions.udf 不需要这样的语义 @MiloMinderbinder 您需要调用spark.udf.register 以便在您的 Spark 会话中注册 UDF,从而能够在使用 SQL 时调用它。不,spark.udf.register 也可以带pyspark.sql.functions.udf 功能。你可以自己测试spark.udf.register("plus_one_udf", plus_one_udf),其中plus_one_udf 是使用F.udf(...) 定义的UDF。

以上是关于SparkSession 中的 udf 和 pyspark.sql.functions 中的 udf 有啥区别的主要内容,如果未能解决你的问题,请参考以下文章

Spark UDF 函数怎么实现参数数量变化?

SparkSQL之UDF使用

Spark之UDF

Spark SQL UDF示例

Spark 2.1 注册UDF到functionRegistry

一套 Spark UDF 实践教程(文末专栏抽奖)