О создании пользовательской функции (UDF) в Spark Scala - PullRequest
0 голосов
/ 06 марта 2020

Я новичок в Scala и хотел узнать о UDF в Spark Scala. Я собираюсь использовать следующий пример, чтобы продемонстрировать мою проблему. Я использую Spark Scala, используя Data Bricks.

Допустим, у меня есть следующий фрейм данных,

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|
+------+-----+----+

Но когда я попробовал это с оператором журнала, это не сработало

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 Ответ

1 голос
/ 06 марта 2020

Вам не нужен udf для функции в вашем вопросе:

someDF.select($"number", $"word", log(lit(25) / (lit(1) + $"number")) as "newC")

Если вы настаиваете на использовании udf, хотя:

val caldf = udf { df: Double => math.log(25/(df+1)) }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...