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

标签 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 完美配合,但会抛出:无法在架构中使用 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/

相关文章:

apache-spark - 将 Spark Dataframe 直接写入 HIVE 需要花费太多时间

apache-spark - Spark-submit - 无法从作为 --archive 提交的环境中导入包

apache-spark - 根据先前的值对 Spark 中的列中的值进行排名

扩展更高种类类型时的 Scala 类型参数与类型字段

scala - 测试 Right[Seq[MyClass]] 和属性

scala - 仅当要转换的函数具有至少两个参数时,才能将函数隐式转换为二阶函数

hadoop - Pyspark 操作提交时 oozie 失败 : '[Errno 2] No such file or directory'

java - 如何从Kafka Topic获取记录总数并保存到HDFS中?

scala - Akka——类型不匹配; [错误] 发现 : Unit [error] required: scala. sys.process.ProcessLogger

performance - 使用什么scala或java库可以以最有效的方式每天从1000个域中抓取+10M页面