Spark UDF:使用" val"定义UDF的函数。工作正常,但定义使用" def"才不是

时间:2018-02-06 21:40:29

标签: scala apache-spark apache-spark-sql spark-dataframe user-defined-functions

我正在尝试编写一些函数用作spark中的UDF。我写了两次相同的函数:一次使用val myFunc,一次使用def myFunc。当我使用spark注册函数时,我注意到使用def myFunc的版本将返回错误,而使用val编写的函数将编译正常。

import org.apache.spark.sql.SparkSession

object Example {
    val spark = SparkSession.builder().getOrCreate()
    val myFunc = (x: Double, y: Double) => {
      x.toString + y.toString
    }
    val myUDF = spark.sqlContext.udf.register("myFunc", (x: Double, y: Double) => myFunc(x, y))
}

上面这个例子编译正常。但是,如果我改变创建函数以使用def的方式,它将不再编译。

import org.apache.spark.sql.SparkSession

object Example {
    val spark = SparkSession.builder().getOrCreate()
    def myFunc(x: Double, y: Double): String = {
      x.toString + y.toString
    }
    val myUDF = spark.sqlContext.udf.register("myFunc", (x: Double, y: Double) => myFunc(x, y))
}

以上编译时会抛出此错误:

No TypeTag available for String
val myUDF = spark.sqlContext.udf.register("myFunc", (x: Double, y: Double) => myFunc(x, y))
                                         ^

有谁知道为什么一个版本有效而​​另一个版本无法编译?

编辑:这是我的gradle构建文件:

apply plugin: 'scala'
apply plugin: 'java'
apply plugin: 'idea'

repositories {
    mavenCentral()
}

dependencies {
    compile 'org.scala-lang:scala-library:2.11.8'

    compileOnly group: 'org.apache.spark', name: 'spark-core_2.10', version: '2.1.1'
    compileOnly group: 'org.apache.spark', name: 'spark-sql_2.10',    version: '2.1.1'
}
version '1.0-SNAPSHOT'

apply plugin: 'java'

sourceCompatibility = 1.8

repositories {
    mavenCentral()
}

0 个答案:

没有答案