关于在Spark Scala中创建用户定义函数(UDF)
我是Scala的初学者,想在Spark Scala中学习UDF。 我将用下面的例子来说明我的问题。我正在使用Spark Scala使用数据块 假设我有以下数据帧关于在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| |
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不起作用。它给出的错误与我在问题中提到的相同。