我正在尝试编写一些函数用作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()
}