1

我不明白火花的行为。

我创建了一个返回整数的 udf,如下所示

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
  }
}

我工作得很好但是如果我将方法测试的返回类型从 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$1: reflect.runtime.universe.TypeTag[String])org.apache.spark.sql.UserDefinedFunction.
Unspecified value parameter evidence$1.
    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

我有点失落......你有什么想法吗?

4

1 回答 1

3

由于我无法重现将您的示例代码复制粘贴到新文件中的问题,因此我敢打赌,您的真实代码String实际上被其他东西所掩盖。要验证这一理论,您可以尝试将签名更改为

def testString() : scala.Predef.String = {
  return "myString"
}

或者

def testString() : java.lang.String = {
  return "myString"
}

如果这个编译,搜索“字符串”看看你是如何隐藏标准类型的。如果您使用 IntelliJ Idea,您可以尝试使用“Ctrl+B”(GoTo)来查找。最明显的候选者是您用作String泛型类型参数的名称,但可能还有其他选择。

于 2018-01-09T18:05:30.720 回答