想象一下以下代码:
def myUdf(arg: Int) = udf((vector: MyData) => {
// complex logic that returns a Double
})
如何定义myUdf的返回类型,以便查看代码的人会立即知道它返回Double?
答案 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
})