Spark - Почему я получаю "найдено: Int () требуется Integer" в случае совпадения в Scala - PullRequest
0 голосов
/ 27 июня 2018

У меня есть следующая функция 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...