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 有啥区别的主要内容,如果未能解决你的问题,请参考以下文章