关于在Spark Scala中创建用户定义函数(UDF)

关于在Spark Scala中创建用户定义函数(UDF),scala,apache-spark,Scala,Apache Spark,我是Scala的初学者,想在Spark Scala中学习UDF。 我将用下面的例子来说明我的问题。我正在使用Spark Scala使用数据块 假设我有以下数据帧 val someDF = Seq( (1, "bat"), (4, "mouse"), (3, "horse") ).toDF("number", "word") someDF.show() +------+-----+ |number| word| +------+-----+ | 1| bat| |

我是Scala的初学者,想在Spark Scala中学习UDF。 我将用下面的例子来说明我的问题。我正在使用Spark Scala使用数据块

假设我有以下数据帧

val someDF = Seq(
  (1, "bat"),
  (4, "mouse"),
  (3, "horse")
).toDF("number", "word")

someDF.show()

+------+-----+
|number| word|
+------+-----+
|     1|  bat|
|     4|mouse|
|     3|horse|
+------+-----+
我需要创建一个函数,通过对数字列执行一些操作来计算一个新列

举个例子,我创建了这个函数来计算25/(数字+1),如下所示,它工作正常

import org.apache.spark.sql.functions.{col, udf}
import org.apache.spark.sql.functions._
val caldf = udf { (df: Double) => (25/(df+1)) }

someDF.select($"number", $"word", caldf(col("number")) as "newc").show()
+------+-----+----+
|number| word|newc|
+------+-----+----+
|     1|  bat|12.5|
|     4|mouse| 5.0|
|     3|horse|6.25|
+------+-----+----+
但当我尝试使用log操作符时,它不起作用

import org.apache.spark.sql.functions.{col, udf}
import org.apache.spark.sql.functions._
val caldf = udf { (df: Double) => log(25/(df+1)) }




 command-3140852555505238:3: error: overloaded method value log with alternatives:
      (columnName: String)org.apache.spark.sql.Column <and>
      (e: org.apache.spark.sql.Column)org.apache.spark.sql.Column
     cannot be applied to (Double)
    val caldf = udf { (df: Double) => log(25/(df+1)) }
                                  ^
import org.apache.spark.sql.functions.{col,udf}
导入org.apache.spark.sql.functions_
val caldf=udf{(df:Double)=>log(25/(df+1))}
命令-3140852555505238:3:错误:重载了方法值日志,其中包含备选项:
(columnName:String)org.apache.spark.sql.Column
(e:org.apache.spark.sql.Column)org.apache.spark.sql.Column
无法应用于(双精度)
val caldf=udf{(df:Double)=>log(25/(df+1))}
^

有人能帮我找出原因吗?谢谢。

问题中的函数不需要自定义项:

someDF.select($"number", $"word", log(lit(25) / (lit(1) + $"number")) as "newC")
如果您坚持使用自定义项:

val caldf = udf { df: Double => math.log(25/(df+1)) }

谢谢你的回答。但当我使用问题中提到的log操作符时,udf不起作用。它给出的错误与我在问题中提到的相同。