以下是两个用作 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 完美配合,但会抛出:无法在架构中使用 Char for udfString
可能是因为它使用 (Int) => (Int) 作为 udfInt 类型,这正是 udf 所期望的
但是将 nextString 视为 String 类型,这显然会导致一个假设,即我在应用该函数时尝试提取 Chars。
如果我做类似的事情,它就会起作用:
def myUDF: () => String = udf(() => nextString)
对于这么简单的事情来说,这看起来很丑陋。有没有办法将 udfString 作为函数而不是字符串传递?
最佳答案
当您编写以下代码时:
def udfString = udf(nextString)
和写作一样
val s = nextString
def udfString = udf(s)
这可以编译,因为字符串也是 Int => Char
的函数(请参阅 here )
您可以通过以下方式告诉编译器您正在将函数传递给 udf:
def udfString = udf(nextString _)
关于scala - 作为参数传递的空参数函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49827712/