Spark UDF не удалось найти неявное значение для параметра num: Numeric [Nothing] - PullRequest
0 голосов
/ 21 ноября 2018

Я пытаюсь написать общий метод добавления, для которого можно взять любой тип аргумента и вернуть результат этого типа

 def addExactUDF[T](x: T, y: T)(implicit num: Numeric[T]): T = {
    import num._
    x + y
  }

  def addExact(value1: Column, value2: Column, dataType: String): Column =
    dataType match {
      case "Int" => expr(s"addExactUDF(cast($value1 AS INT), cast($value2 AS INT))")
      case "Double" => expr(s"addExactUDF(cast($value1 AS DOUBLE), cast($value2 AS DOUBLE))")
    }

Теперь, когда я пытаюсь зарегистрировать UDF

object FilterFunctionsUtil extends MathFunctionsNameSpace with StringFunctionsNameSpace {
  lazy val registerAsSparkUdf: UserDefinedFunction = {
    val sqlContext = SparkSessionFactory.getSparkSession(Map(), Nil).sqlContext

    sqlContext.udf.register("addExactUDF", addExactUDF _)
    sqlContext.udf.register("subtractExactUDF", subtractExactUDF _)
  }
}

Это выдает мне ошибку

   Error:(36, 44) could not find implicit value for parameter num: Numeric[Nothing]
        sqlContext.udf.register("addExactUDF", addExactUDF _)
Error:(36, 44) not enough arguments for method addExactUDF: (implicit num: Numeric[Nothing])Nothing.
Unspecified value parameter num.
    sqlContext.udf.register("addExactUDF", addExactUDF _)

как мне добавить неявное, чтобы эта работа

1 Ответ

0 голосов
/ 21 ноября 2018

Укажите неявный тип при регистрации UDF.при необходимости вам может потребоваться зарегистрировать отдельные UDF для каждого типа.

  import sqlContext.implicits._
  val df = sc.parallelize(Seq((1,2),(3,4))).toDF("val1","val2")

  df.createOrReplaceTempView("tempTable")
  sqlContext.cacheTable("tempTable")

  sqlContext.udf.register("addExtractIntUDF",addExtractUDF[Int] _)

  sqlContext.sql("select addExtractIntUDF(val1,val2) from temptable").show(false)

Результат

+ --------------------------------------------- +
| UDF: addExtractIntUDF (val1, val2) |
+ --------------------------------------------- +
| 3|
| 7 |
+ -------------------------------------------- +

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...