【问题标题】:spark scala can't find codec for java.lang.classspark scala 找不到 java.lang.class 的编解码器
【发布时间】:2017-01-06 16:34:48
【问题描述】:

spark 和 scala 的新手。我正在尝试通过 intellij-idea 执行一个非常简单的 spark 程序。它所做的只是:

  1. 将 mongodb 数据库连接到特定集合
  2. 加载数据
  3. 打印第一条记录。

它工作正常,但现在它抛出错误:

org.bson.codecs.configuration.CodecConfigurationException:找不到 类 java.lang.Class 的编解码器。

这是我的代码:

import org.apache.spark.{SparkConf, SparkContext}
import com.mongodb.spark._
import com.mongodb.spark.rdd.MongoRDD
import org.bson.Document
import com.mongodb.spark.config._
import org.apache.spark.sql.SQLContext
import com.mongodb.spark.sql._
import scala.reflect.runtime.universe._

object Analytics1 {
  def main(args: Array[String]) {
val conf = new SparkConf().setAppName("Analytics1").setMaster("local").
      set("spark.mongodb.input.uri","mongodb://192.168.56.1:27017/events.entEvent")
        .set("spark.mongodb.output.uri", "mongodb://192.168.56.1:27017/events..entResult")
val sc = new SparkContext(conf)

val rdd = sc.loadFromMongoDB()
println(rdd.first())

sc.stop()

  }
}

这是我的 .sbt。如果我使用最新版本的 spark,那么它会抛出这个错误

线程“主”java.lang.NoClassDefFoundError 中的异常: org/apache/spark/sql/DataFrame

所以我使用的是 1.6.1,直到几天前都可以正常工作,但现在它正在抛出

java.lang.class

错误。有人请帮忙,这样我就可以动起来了。由于这是非常基本的,我希望有人会提出一些建议并让我畅通无阻。

谢谢。

    name := "Simple Project"

version := "1.0"

scalaVersion := "2.11.7"

// libraryDependencies += "org.apache.spark" %% "spark-core" % "1.6.1"
libraryDependencies += "org.apache.spark" %% "spark-core" % "1.6.1"

//libraryDependencies += "org.apache.spark" % "spark-mllib_2.11" % "1.6.1"
libraryDependencies += "org.apache.spark" %% "spark-mllib" % "1.6.1"

//libraryDependencies += "org.mongodb.spark" % "mongo-spark-connector_2.10" % "1.1.0"
libraryDependencies += "org.mongodb.spark" %% "mongo-spark-connector" % "1.1.0"

libraryDependencies += "org.mongodb.scala" %% "mongo-scala-driver" % "1.2.1"

libraryDependencies += "org.apache.spark" %% "spark-sql" % "1.6.1"

resolvers += "Akka Repository" at "http://repo.akka.io/releases/"
resolvers += "snapshots" at "https://oss.sonatype.org/content/repositories/snapshots/ "
resolvers += "releases"  at "https://oss.sonatype.org/content/repositories/releases/"

【问题讨论】:

  • 寻找这个问题的答案的人,请阅读下面Wan的所有cmet。

标签: mongodb scala apache-spark intellij-idea


【解决方案1】:

libraryDependencies += "org.mongodb.spark" % "mongo-spark-connector_2.10" % "1.1.0"

您正在为 Scala 版本 2.10 加载 MongoDB Connector for Spark。虽然,您的项目使用的是 Scala 版本 2.11.7,包括 mongo-scala-driver

将上面一行换成:

libraryDependencies += "org.mongodb.spark" % "mongo-spark-connector_2.11" % "1.1.0"

通过指定 double % 或者使用给定 Scala 版本的快捷方式:

libraryDependencies += "org.mongodb.spark" %% "mongo-spark-connector" % "1.1.0"

查看更多关于SBT dependencies: Getting the right Scala version

【讨论】:

  • 谢谢万。我尝试了这两种选择,但没有成功。我什至使用带有 %% 的快捷方式尝试了我的 mllib 依赖项。那也没有帮助。我的猜测是这与我无法弄清楚的依赖项和/或导入有关。
  • 我认为问题出在println。如果我使用rdd.toDF().show(10) 而不是println(rdd.first())。有用。但数据显示为 DF。但我希望它像一个 RDD 输出。关于如何解决这个问题的任何想法?
  • 您需要用错误消息等描述您遇到的problem。您是说现在codec java.lang.class 消失了,但println 出现了另一个错误?制作一个更小的脚本,测试和调试。发布任何错误消息和一个可重现的小脚本。
  • 当我使用println(rdd.first()) 时,它会抛出java.lang.class 错误。如果我使用rdd.toDF().show(1),它可以正常工作。但是这个方法的问题是它以数据帧格式返回结果。我需要它的RDD格式。更简单的脚本?,我只是为 mongo、spark context 和 rdd 声明配置参数,然后打印第一条记录。还有什么比这更简单的呢?
  • 1) 在您的帖子中更新您的build.sbt,以反映您所做的更改。 2) 你应该只需要 3 个依赖项来完成你想要做的事情。 spark-corespark-sqlmongo-spark-connector。按照这个顺序试试。 3)删除不必要的导入语句。您应该只需要org.apache.spark.{SparkConf, SparkContext}org.mongodb.spark._com.mongodb.spark.config._org.bson.Document。 4) 执行sbt clean 或删除以前的构建,因为您仍然获取以前不正确版本的依赖项。 5) 如果仍有问题,请发布确切的错误日志。
猜你喜欢
  • 2021-05-08
  • 1970-01-01
  • 2017-02-09
  • 2018-02-11
  • 2016-12-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-01
相关资源
最近更新 更多