udf 没有可用于类型字符串的 TypeTag
udf No TypeTag available for type string
我不明白spark的行为。
我创建了一个 udf,其中 return 是一个整数,如下所示
import org.apache.spark.sql.SQLContext
import org.apache.spark.{SparkConf, SparkContext}
object Show {
def main(args: Array[String]): Unit = {
val (sc,sqlContext) = iniSparkConf("test")
val testInt_udf = sqlContext.udf.register("testInt_udf", testInt _)
}
def iniSparkConf(appName: String): (SparkContext, SQLContext) = {
val conf = new SparkConf().setAppName(appName)//.setExecutorEnv("spark.ui.port", "4046")
val sc = new SparkContext(conf)
sc.setLogLevel("WARN")
val sqlContext = new SQLContext(sc)
(sc, sqlContext)
}
def testInt() : Int= {
return 2
}
}
我工作得很好,但是如果我将 return 类型的方法测试从 Int 更改为 String
val testString_udf = sqlContext.udf.register("testString_udf", testString _)
def testString() : String = {
return "myString"
}
我收到以下错误
Error:(34, 43) No TypeTag available for String
val testString_udf = sqlContext.udf.register("testString_udf", testString _)
Error:(34, 43) not enough arguments for method register: (implicit evidence: reflect.runtime.universe.TypeTag[String])org.apache.spark.sql.UserDefinedFunction.
Unspecified value parameter evidence.
val testString_udf = sqlContext.udf.register("testString_udf", testString _)
这是我嵌入的罐子:
datanucleus-api-jdo-3.2.6
datanucleus-core-3.2.10
datanucleus-rdbms-3.2.9
spark-1.6.1-yarn-shuffle
spark-assembly-1.6.1-hadoop2.6.0
spark-examples-1.6.1-hadoop2.6.0
我有点迷茫...你有什么想法吗?
由于我无法重现仅将您的示例代码复制粘贴到新文件中的问题,我敢打赌在您的真实代码中 String
实际上被其他东西遮住了。为了验证这个理论,您可以尝试将您的签名更改为
def testString() : scala.Predef.String = {
return "myString"
}
或
def testString() : java.lang.String = {
return "myString"
}
如果编译成功,请搜索 "String" 以查看您是如何隐藏标准类型的。如果你使用 IntelliJ Idea,你可以尝试使用 "Ctrl+B" (GoTo) 来查找它。最明显的候选者是您使用 String
作为泛型类型参数的名称,但可能还有一些其他选择。
我不明白spark的行为。
我创建了一个 udf,其中 return 是一个整数,如下所示
import org.apache.spark.sql.SQLContext
import org.apache.spark.{SparkConf, SparkContext}
object Show {
def main(args: Array[String]): Unit = {
val (sc,sqlContext) = iniSparkConf("test")
val testInt_udf = sqlContext.udf.register("testInt_udf", testInt _)
}
def iniSparkConf(appName: String): (SparkContext, SQLContext) = {
val conf = new SparkConf().setAppName(appName)//.setExecutorEnv("spark.ui.port", "4046")
val sc = new SparkContext(conf)
sc.setLogLevel("WARN")
val sqlContext = new SQLContext(sc)
(sc, sqlContext)
}
def testInt() : Int= {
return 2
}
}
我工作得很好,但是如果我将 return 类型的方法测试从 Int 更改为 String
val testString_udf = sqlContext.udf.register("testString_udf", testString _)
def testString() : String = {
return "myString"
}
我收到以下错误
Error:(34, 43) No TypeTag available for String
val testString_udf = sqlContext.udf.register("testString_udf", testString _)
Error:(34, 43) not enough arguments for method register: (implicit evidence: reflect.runtime.universe.TypeTag[String])org.apache.spark.sql.UserDefinedFunction.
Unspecified value parameter evidence.
val testString_udf = sqlContext.udf.register("testString_udf", testString _)
这是我嵌入的罐子:
datanucleus-api-jdo-3.2.6
datanucleus-core-3.2.10
datanucleus-rdbms-3.2.9
spark-1.6.1-yarn-shuffle
spark-assembly-1.6.1-hadoop2.6.0
spark-examples-1.6.1-hadoop2.6.0
我有点迷茫...你有什么想法吗?
由于我无法重现仅将您的示例代码复制粘贴到新文件中的问题,我敢打赌在您的真实代码中 String
实际上被其他东西遮住了。为了验证这个理论,您可以尝试将您的签名更改为
def testString() : scala.Predef.String = {
return "myString"
}
或
def testString() : java.lang.String = {
return "myString"
}
如果编译成功,请搜索 "String" 以查看您是如何隐藏标准类型的。如果你使用 IntelliJ Idea,你可以尝试使用 "Ctrl+B" (GoTo) 来查找它。最明显的候选者是您使用 String
作为泛型类型参数的名称,但可能还有一些其他选择。