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

Posted

技术标签:

【中文标题】Apache Spark - UDF 似乎不适用于 spark-submit【英文标题】:Apache Spark - UDF doesn't seem to work with spark-submit 【发布时间】:2016-08-17 21:37:17 【问题描述】:

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

请看下面的错误信息、示例代码、build.sbt 和运行程序的命令

感谢所有帮助! - 问候,文基


错误消息:(第 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)

代码:

/* 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

【问题讨论】:

尝试使用命令行选项 add jar <path> 添加 Spark SQL jar,或尝试使用程序集/fat jar。 您应该使用...%% "spark-core" % "1.6.1" % "provided", 设置spark-core 【参考方案1】:

当您看到有关 scala 库的 NoSuchMethodClassNotFound(在本例中为 scala.reflect.api.JavaUniverse.runtimeMirror)时,这通常意味着某个地方发生了 scala 版本不匹配。

您使用的是 spark 1.6.1,它是为 scala 2.10 预先构建的,但您的项目是 scala 2.11.7,因此出现错误。

您的选择是:

    将您的项目降级到 2.10 构建支持 2.11 的 Spark 1.6.1(来自源代码) 使用预先构建的 Spark 2.0,支持 2.11

【讨论】:

感谢您的帮助!我在 sbt 构建文件中将 scalaVersion 设置为 2.10.6,这样它就可以工作了。当我迁移到 Spark 2.0 时,我会记得使用 scala 2.11。 很高兴为您提供帮助,欢迎来到 Stack Overflow。如果此答案解决了您的问题,请将其标记为已接受 :)

以上是关于Apache Spark - UDF 似乎不适用于 spark-submit的主要内容,如果未能解决你的问题,请参考以下文章

对象内部定义的 Apache-Spark UDF 引发“没有可用于字符串的 TypeTag”

在Apache Spark中使用UDF

我用 java 在 spark sql UDF 中编写,但似乎出了点问题

用于日期操作的 SparkSQL (Spark 1.3) UDF

在pyspark中使用pandas udf/apache Arrow

Apache Spark - 注册 UDF - 返回数据帧