在Spark Scala UDF中定义返回值

时间:2017-05-31 18:08:33

标签: scala apache-spark user-defined-functions udf

想象一下以下代码:

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

如何定义myUdf的返回类型,以便查看代码的人会立即知道它返回Double?

4 个答案:

答案 0 :(得分:2)

UDF与lambda函数没有什么特别之处,它们的行为就像scala lambda函数(参见Specifying the lambda return type in Scala),所以你可以这样做:

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))

答案 1 :(得分:2)

我看到两种方法,首先定义一个方法,然后将其提升到一个函数

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)

我通常对我的UDF使用firt方法

答案 2 :(得分:2)

您可以将类型参数传递给udf,但您需要首先反直觉地传递返回类型,然后输入类型为[ReturnType, ArgTypes...],至少从Spark 2.3.x开始。使用原始示例(,它似乎是基于arg 的curried函数):

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

答案 3 :(得分:0)

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

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

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