У меня есть следующая функция udf:
def DayBlock(t: Integer): Integer = {
val Block = t match{
case 2 | 3 | 1 | 0 | 24 => 4
case 23 | 22 | 21 => 3
case 19 | 17 | 20 | 18 => 2
case 15 | 16 | 13 | 14 | 12 => 1
}
Block
}
val DayBlockUDF = udf[Integer, Integer](DayBlock)
Но внутри корпуса я получаю для каждого номера жесткого кода следующую ошибку:
> error: type mismatch; found : Int(2) required: Integer
> case 2 | 3 | 1 | 0 | 24 => 4
Я искал решения для аналогичной проблемы на SO, и вот три решения, которые я безуспешно пробовал:
import spark.implicits._
@deprecated type Integer = java.lang.Integer
implicit def javaToScalaInt(d: java.lang.Integer) = d.intValue
Чего мне не хватает?
Редактировать на основе комментариев.
Если я изменил Integer на Int. Как это:
def DayBlock(t: Int): Int = {
val Block = t match{
case 2 | 3 | 1 | 0 | 24 => 4
case 23 | 22 | 21 => 3
case 19 | 17 | 20 | 18 => 2
case 15 | 16 | 13 | 14 | 12 => 1
}
Block
}
val DayBlockUDF = udf[Int, Int](DayBlock)
val DayBlockDF = df.withColumn("newTime",DayBlockUDF($"oldTime"))
Тогда у меня есть другая ошибка:
org.apache.spark.SparkException: Failed to execute user defined function($anonfun$1: (int) => int)
at org.apache.spark.sql.catalyst.expressions.GeneratedClass$GeneratedIteratorForCodegenStage1.project_doConsume$(Unknown Source)
at org.apache.spark.sql.catalyst.expressions.GeneratedClass$GeneratedIteratorForCodegenStage1.processNext(Unknown Source)
at org.apache.spark.sql.execution.BufferedRowIterator.hasNext(BufferedRowIterator.java:43)
at org.apache.spark.sql.execution.WholeStageCodegenExec$$anonfun$10$$anon$1.hasNext(WholeStageCodegenExec.scala:614)
at org.apache.spark.sql.execution.collect.UnsafeRowBatchUtils$.encodeUnsafeRows(UnsafeRowBatchUtils.scala:49)
at org.apache.spark.sql.execution.collect.Collector$$anonfun$2.apply(Collector.scala:126)
at org.apache.spark.sql.execution.collect.Collector$$anonfun$2.apply(Collector.scala:125)
at org.apache.spark.scheduler.ResultTask.runTask(ResultTask.scala:87)
at org.apache.spark.scheduler.Task.run(Task.scala:111)
at org.apache.spark.executor.Executor$TaskRunner.run(Executor.scala:350)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at java.lang.Thread.run(Thread.java:748)
Caused by: scala.MatchError: 11 (of class java.lang.Integer)