何时在PySpark中使用UDF与功能?

时间:2019-05-09 01:01:21

标签: python apache-spark pyspark user-defined-functions azure-databricks

我正在将Spark与Databricks结合使用,并具有以下代码:

def replaceBlanksWithNulls(column):
    return when(col(column) != "", col(column)).otherwise(None)

这两个下一个语句都起作用:

x = rawSmallDf.withColumn("z", replaceBlanksWithNulls("z"))

并使用UDF:

replaceBlanksWithNulls_Udf = udf(replaceBlanksWithNulls)
y = rawSmallDf.withColumn("z", replaceBlanksWithNulls_Udf("z"))

documentation上我不清楚我何时应该使用另一个,为什么?

2 个答案:

答案 0 :(得分:1)

您可以在Spark SQL中找到区别(如文档中所述)。例如,您会发现,如果您编写:

spark.sql("select replaceBlanksWithNulls(column_name) from dataframe")
如果未将功能replaceBlanksWithNulls注册为udf,则

不起作用。在spark sql中,我们需要知道执行函数的返回类型。因此,我们需要将自定义函数注册为要在spark sql中使用的用户定义函数(udf)。

答案 1 :(得分:1)

UDF本质上可以是任何类型的函数(当然也有例外)-不必使用诸如whencol等的Spark结构。使用UDF的{​​{1}}函数可以写成普通的python代码:

replaceBlanksWithNulls

在注册后可以在数据框列上使用:

def replaceBlanksWithNulls(s):
    return "" if s != "" else None

注意:replaceBlanksWithNulls_Udf = udf(replaceBlanksWithNulls) y = rawSmallDf.withColumn("z", replaceBlanksWithNulls_Udf("z")) 的默认返回类型是字符串。如果在注册时需要指定其他类型,例如

UDF

在这种情况下,列操作并不复杂,并且有一些Spark函数可以实现相同的功能(即与问题中的from pyspark.sql.types import LongType squared_udf = udf(squared, LongType()) 相同:

replaceBlanksWithNulls

尽可能总是首选,因为它允许Spark优化查询,请参见例如Spark functions vs UDF performance?