Spark Scala 寄存器 UDF - 为什么我需要在函数结束时传递下划线 (_)



>我在 Scala 中创建了一个 UDF,当我尝试仅使用函数名称注册此 UDF 时,它向我显示错误。

不工作

def IPConvertUDF = spark.udf.register("IPConvertUDF", IPConvert)

错误

error: missing argument list for method IPConvert
Unapplied methods are only converted to functions when a function type is expected.
You can make this conversion explicit by writing `IPConvert _` or `IPConvert(_)` instead of `IPConvert`.
def IPConvertUDF = spark.udf.register("IPConvertUDF", IPConvert)

所以我在方法名称后添加了额外的_,它起作用了。

完美工作

def IPConvertUDF = spark.udf.register("IPConvertUDF", IPConvert _)

有人可以解释一下方法名称后额外_的含义是什么吗?

简短的回答是,您正在尝试传递一个method,其中function作为参数。方法不是函数。让我们更深入地挖掘。

让我们先尝试简单的添加function

 val add:(Int,Int) => Int = (val1,val2) => val1+val2
 spark.udf.register("add",add)

上面的代码编译没有任何错误。 原因是add是一个function

现在让我们尝试与method相同的add

def add(val1:Int,val2:Int): Int ={
     val1+val2
   }
 spark.udf.register("add",add)

现在您收到一个错误,说error: missing argument list for method add 。正如我所提到的,register(..)期待函数和方法不能作为参数传递。

_是部分应用函数的简写。换句话说,add方法被转换为partially applied function这就是错误消失的原因。

spark.udf.register("add",add _)

最新更新