关于在 Spark Scala 中创建用户定义函数 (UDF)
Posted
技术标签:
【中文标题】关于在 Spark Scala 中创建用户定义函数 (UDF)【英文标题】:About creating a User Defined Function (UDF) in Spark Scala 【发布时间】:2020-03-06 00:15:43 【问题描述】:我是 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/(number+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|
+------+-----+----+
但是当我用日志操作符尝试这个时,它不起作用
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))
^
谁能帮我弄清楚可能是什么原因?谢谢。
【问题讨论】:
【参考方案1】:您的问题中的函数不需要 udf:
someDF.select($"number", $"word", log(lit(25) / (lit(1) + $"number")) as "newC")
如果你坚持使用 udf:
val caldf = udf df: Double => math.log(25/(df+1))
【讨论】:
感谢您的回答。但是当我使用问题中提到的日志运算符时,udf 不起作用。它给出了与我在问题中提到的相同的错误。以上是关于关于在 Spark Scala 中创建用户定义函数 (UDF)的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Spark Scala 中的 Schema RDD [从案例类中创建] 中查找重复项以及相应的重复计数?