Gau*_*hah 4 scala apache-spark
我在 Scala 中创建了一个 UDF,当我试图用函数名注册这个 UDF 时,它显示了我的错误。
不工作
def IPConvertUDF = spark.udf.register("IPConvertUDF", IPConvert)
Run Code Online (Sandbox Code Playgroud)
错误
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)
Run Code Online (Sandbox Code Playgroud)
所以我
_在方法名称之后添加了额外的东西并且它起作用了。
完美运行
def IPConvertUDF = spark.udf.register("IPConvertUDF", IPConvert _)
Run Code Online (Sandbox Code Playgroud)
有人能解释一下_方法名后面的extra是什么意思吗?
嗯,简短的回答是,您正在尝试传递 a methodwhere afunction预期作为参数。方法不是函数。让我们深入挖掘一下。
让我们用简单的加试function第一
val add:(Int,Int) => Int = (val1,val2) => val1+val2
spark.udf.register("add",add)
Run Code Online (Sandbox Code Playgroud)
上面的代码编译没有任何错误。原因add是一个function.
现在,让我们尝试相同add的method
def add(val1:Int,val2:Int): Int ={
val1+val2
}
spark.udf.register("add",add)
Run Code Online (Sandbox Code Playgroud)
现在你得到一个错误说error: missing argument list for method add. 正如我所提到的,register(..)期望函数和方法不能作为参数传递。
_是部分应用函数的简写。换句话说, add 方法被转换为partially applied function,这就是错误消失的原因。
spark.udf.register("add",add _)
Run Code Online (Sandbox Code Playgroud)