想象以下代码:
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
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))