>我在 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 _)