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

时间:2019-07-15 01:08:58

标签: scala apache-spark

我已经在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 _) 是什么意思吗?

1 个答案:

答案 0 :(得分:1)

一个简短的答案是,您正在尝试传递一个method作为参数的functionMethods are not functions。 让我们深入一点。

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

 val add:(Int,Int) => Int = (val1,val2) => val1+val2

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

以上代码编译无任何错误。原因是addfunction

现在让我们尝试与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 _)