在Spark Scala UDF中定义返回值



想象以下代码:

def myUdf(arg: Int) = udf((vector: MyData) => {
  // complex logic that returns a Double
})

我如何为myudf定义返回类型,以便查看代码的人们会立即知道它返回双重?

我看到了两种方法,要么首先定义方法,然后将其提起到函数

def myMethod(vector:MyData) : Double = {
  // complex logic that returns a Double
}
val myUdf = udf(myMethod _)

或首先使用显式类型定义函数:

val myFunction: Function1[MyData,Double] = (vector:MyData) => {
  // complex logic that returns a Double
}
val myUdf = udf(myFunction)

我通常使用UDFS

使用FIRT方法

spark函数定义了几种具有以下修饰符/类型的udf方法:static <RT,A1, ..., A10> UserDefinedFunction

您可以在平方括号中指定输入/输出数据类型,如下所示:

def myUdf(arg: Int) = udf[Double, MyData]((vector: MyData) => {
  // complex logic that returns a Double
})

您可以将类型参数传递给udf,但您似乎需要首先反触摸传递返回类型,然后是[ReturnType, ArgTypes...]之类的输入类型,至少是Spark 2.3.x。使用原始示例(似乎是基于arg 的咖喱功能(:

def myUdf(arg: Int) = udf[Double, Seq[Int]]((vector: Seq[Int]) => {
  13.37 // whatever
})

使用lambda函数的UDF没有什么特别的,它们的行为就像Scala lambda函数(请参阅Scala中的lambda返回类型(,因此您可以这样做:

def myUdf(arg: Int) = udf(((vector: MyData) => {
  // complex logic that returns a Double
}): (MyData => Double))

或明确定义您的功能:

def myFuncWithArg(arg: Int) {
  def myFunc(vector: MyData): Double = {
     // complex logic that returns a Double. Use arg here
  }
  myFunc _
}
def myUdf(arg: Int) = udf(myFuncWithArg(arg))

最新更新