Spark Scala 注册 UDF - 为什么我需要在函数末尾传递下划线 (_)

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是什么意思吗?

Bal*_*raj 5

嗯,简短的回答是,您正在尝试传递 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.

现在,让我们尝试相同addmethod

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)