以下是两个用作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?
答案 0 :(得分:3)
当您编写以下代码时:
def udfString = udf(nextString)
与写作相同
val s = nextString
def udfString = udf(s)
这是编译因为字符串也是Int => Char
的函数(参见here)
您可以通过以下方式告诉编译器您正在将函数传递给udf:
def udfString = udf(nextString _)