开发者社区> 问答> 正文

Spark UDF找不到参数num的隐含值:Numeric [Nothing]

我正在尝试编写泛型add方法,可以采用任何参数类型并返回该类型的结果

def addExactUDFT(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 _)

如何添加隐式以使其工作

展开
收起
flink小助手 2018-12-13 11:28:42 2554 0
1 条回答
写回答
取消 提交回答
  • flink小助手会定期更新直播回顾等资料和文章干货,还整合了大家在钉群提出的有关flink的问题及回答。

    注册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 |

    2019-07-17 23:20:25
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
Hybrid Cloud and Apache Spark 立即下载
Scalable Deep Learning on Spark 立即下载
Comparison of Spark SQL with Hive 立即下载