Spark找不到Scala特定的方法

时间:2017-07-28 15:47:07

标签: java scala apache-spark sbt apache-spark-mllib

问题是每个作业都失败并出现以下异常:

Exception in thread "main" java.lang.NoSuchMethodError: scala.Predef$.refArrayOps([Ljava/lang/Object;)[Ljava/lang/Object;
at ps.sparkapp.Classification$.main(Classification.scala:35)
at ps.sparkapp.Classification.main(Classification.scala)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.apache.spark.deploy.SparkSubmit$.org$apache$spark$deploy$SparkSubmit$$runMain(SparkSubmit.scala:743)
at org.apache.spark.deploy.SparkSubmit$.doRunMain$1(SparkSubmit.scala:187)
at org.apache.spark.deploy.SparkSubmit$.submit(SparkSubmit.scala:212)
at org.apache.spark.deploy.SparkSubmit$.main(SparkSubmit.scala:126)
at org.apache.spark.deploy.SparkSubmit.main(SparkSubmit.scala)

这个异常测试表明该任务无法找到该方法。我使用intelij社区版开发。我编译包没有问题。所有依赖项都已正确打包。在这里我的build.sbt:

name := "SparkApp"
version := "1.0"

scalaVersion := "2.11.6"

libraryDependencies += "org.apache.spark" % "spark-core_2.11" % "2.1.1"
libraryDependencies += "org.apache.spark" % "spark-mllib_2.11" % "2.1.1"


 scala -version 
 Scala code runner version 2.11.6 -- Copyright 2002-2013, LAMP/EPFL

我发现这个错误与scala有某种关系,因为只有在我使用scala本机的功能时才会发生这种情况,例如scala for loop,.map或.drop(2)。 类和一切仍然用scala编写,但如果我避免像.map或drop(2)这样的功能,那么一切正常。

import org.apache.spark.ml.feature.VectorAssembler
import org.apache.spark.sql.SparkSession
import org.apache.spark.ml.linalg.Vector

object Classification {

  def main(args: Array[String]) {
    ...
    //df.printSchema()
    var dataset = df.groupBy("user_id","measurement_date").pivot("rank").min()

    val col = dataset.schema.fieldNames.drop(2) // <- here the error happens

    // take all features and put them into one vector
    val assembler = new VectorAssembler()
      .setInputCols(col)
      .setOutputCol("features")

    val data = assembler.transform(dataset)
    data.printSchema()
    data.show()

    sc.stop()
  }

}

如上所述,如果我不使用.drop(2)一切都很完美,但是避免使用这些方法是没有选择的,因为这是非常痛苦的。

我在网上找不到任何解决方案,任何想法?

BTW:我可以在spark-shell中使用这些方法,我觉得很奇怪。

提前致谢。

注1)

我用: SPARK版本2.1.1

使用Scala版本2.11.8(OpenJDK 64位服务器VM,Java 1.8.0_131)

1 个答案:

答案 0 :(得分:0)

尝试将实际的Scala库等添加为项目依赖项。 E.g:

  

libraryDependencies + =“org.scala-lang”%“scala-library”%“2.11.6”