关于在 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)的主要内容,如果未能解决你的问题,请参考以下文章

在 Python 中创建自定义 Spark RDD

使用Scala在Spark中创建DataFrame时出错

如何在 Spark Scala 中的 Schema RDD [从案例类中创建] 中查找重复项以及相应的重复计数?

Spark/Scala - 无法执行用户定义的函数

无法使用 Scala 在 Apache Spark 中执行用户定义的函数

scala用户定义函数在spark sql中不起作用