我已经在Scala中创建了一个UDF,并且当我尝试使用功能名称注册该UDF时,它向我显示错误。
不起作用
moment().utcOffset(tzOffset)
错误
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 _)
是什么意思吗?
答案 0 :(得分:1)
一个简短的答案是,您正在尝试传递一个method
作为参数的function
。 Methods are not functions。
让我们深入一点。
让我们先尝试简单地添加function
val add:(Int,Int) => Int = (val1,val2) => val1+val2
spark.udf.register("add",add)
以上代码编译无任何错误。原因是add
是function
。
现在让我们尝试与add
相同的method
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 _)