作为参数传递的空参数函数

时间:2018-04-14 03:51:25

标签: scala apache-spark

以下是两个用作UDF的函数:

def nextString(): String = Random.nextString(10)
def plusOne(a: Int): Int = a + 1

def udfString = udf(nextString)
def udfInt = udf(plusOne)

如果我尝试使用withColumn,myUDF1将与udfInt完美配合,但抛出:不能在Schema中使用Char 用于udfString

可能导致它使用(Int)=> (Int)用于udfInt类型,这是udf期望的

但是将nextString视为String类型,这显然导致了一个假设,即我在应用函数时尝试提取Chars。

如果我执行以下操作,它将起作用:

def myUDF: () => String = udf(() => nextString)

对于那些简单的事情来说,这看起来很难看。有没有办法将udfString作为函数传递,而不是作为String?

1 个答案:

答案 0 :(得分:3)

当您编写以下代码时:

def udfString = udf(nextString)

与写作相同

val s = nextString
def udfString = udf(s)

这是编译因为字符串也是Int => Char的函数(参见here

您可以通过以下方式告诉编译器您正在将函数传递给udf:

def udfString = udf(nextString _)