Apache Spark - UDF似乎不适用于spark-submit

时间:2016-08-17 21:37:18

标签: scala apache-spark apache-spark-sql udf

我无法让UDF与spark-submit一起使用。使用spark-shell时我没有任何问题。

请参阅下面的错误消息,示例代码,build.sbt以及运行程序的命令

将感谢所有的帮助! - 问候,Venki

错误消息:(第20行是定义UDF的地方)

Exception in thread "main" java.lang.NoSuchMethodError:
scala.reflect.api.JavaUniverse.runtimeMirror(Ljava/lang/ClassLoader;)
Lscala/reflect/api/JavaUniverse$JavaMirror;
at TryUDFApp$.main(TryUDFApp.scala:20)

CODE:

/* TryUDFApp.scala */

import org.apache.spark.SparkConf
import org.apache.spark.SparkContext
import org.apache.spark.SparkContext._
import org.apache.spark.sql._
import org.apache.spark.sql.functions._
import org.apache.spark.sql.types._

object TryUDFApp {
def main(args: Array[String]) {
val conf = new SparkConf().setAppName("Simple Application")
val sc = new SparkContext(conf)
// print "Hello world"
println("Hello World -- I am trying to use UDF!")
// Create a UDF
val tryUDF = udf { (arg1: String, arg2: String) => arg2 + arg1 }
}
}

build.sbt

name := "TryUDFApp Project"
version := "1.0"
scalaVersion := "2.11.7"

libraryDependencies ++= Seq(
    "org.apache.spark" %% "spark-core" % "1.6.1",
    "org.apache.spark" %% "spark-sql"  % "1.6.1"
)

运行代码的命令:

$SPARK_HOME/bin/spark-submit --class "TryUDFApp" --master local[4] $TADIR/target/scala-2.11/tryudfapp-project_2.11-1.0.jar

echo $SPARK_HOME

/Users/venki/Spark/spark-1.6.1-bin-hadoop2.6

1 个答案:

答案 0 :(得分:3)

当您看到有关scala库的ClassNotFoundscala.reflect.api.JavaUniverse.runtimeMirror时(在本例中为va_arg(l, char); ),这通常意味着scala版本在某处发生了不匹配。

你正在使用spark 2.1.1,它是为scala 2.10预先构建的,但你的项目是scala 2.11.7,因此错误。

您的选择是:

  1. 将您的项目降级为2.10
  2. 使用2.11支持构建Spark 1.6.1(来自源代码)
  3. 使用预先构建2.11支持的Spark 2.0