【问题标题】: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 中没有。为什么只需要第一种情况?

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

【问题讨论】:

    标签: apache-spark pyspark apache-spark-sql user-defined-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。
    猜你喜欢
    • 2016-12-26
    • 2021-03-15
    • 2022-01-10
    • 2022-10-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-17
    • 1970-01-01
    相关资源
    最近更新 更多