杰克逊图书馆版本confilct

时间:2017-03-21 02:14:41

标签: json scala jackson

dependencies {
    compile group: 'org.scala-lang', name: 'scala-library', version: '2.11.1'
    compile group: 'org.apache.spark', name: 'spark-core_2.11', version: '2.1.0'
    compile group: 'org.apache.spark', name: 'spark-sql_2.11', version: '2.1.0'
    compile group: 'org.elasticsearch', name: 'elasticsearch-spark-20_2.11', version: '5.1.2'

这是我的gradle配置的一部分。它找到了。 当我添加如下所示的'play-json'库来处理json字符串时。

compile group: 'com.typesafe.play', name: 'play-json_2.11', version: '2.5.13'

错误出现在scala尝试读取csv文件的地方。

  

引起:com.fasterxml.jackson.databind.JsonMappingException:   不相容的杰克逊版本:2.7.8 at   com.fasterxml.jackson.module.scala.JacksonModule $ class.setupModule(JacksonModule.scala:64)     在   com.fasterxml.jackson.module.scala.DefaultScalaModule.setupModule(DefaultScalaModule.scala:19)

    spark.read
        .option("header", fileHeader)
        .option("charset", charset)
        .csv( "./data/" + filePath) // error here

我正在使用scala 2.11和spark 2.1.0。 有什么想法吗?

3 个答案:

答案 0 :(得分:2)

问题在于Spark依赖于旧版本的Jackson和Jackson Scala module。我想这个模块并没有与最新版本的Jackson一起发挥作为compile('org.apache.spark:spark-core_2.11:2.1.0') { exclude group: 'com.fasterxml.jackson.core', module: 'jackson-databind' exclude group: 'com.fasterxml.jackson.module', module: 'jackson-module-scala_2.11' } 的依赖关系。

尝试将杰克逊作为传递依赖项排除在Spark之外:

cos(pi * i/2) => cos(pi* 0/2) => cos(0) => 1
if(a = cos(pi * i/2)) => if(a = 1)  => if(1)

您也可以尝试添加对Jackson 2.7.8的直接依赖。

答案 1 :(得分:2)

Play 2.4.10适用于Spark 2.1,因为他们使用的杰克逊是相似的

dependencies {
    compile group: 'org.scala-lang', name: 'scala-library', version: '2.11.1'
    compile group: 'org.apache.spark', name: 'spark-core_2.11', version: '2.1.0'
    compile group: 'org.apache.spark', name: 'spark-sql_2.11', version: '2.1.0'
    compile group: 'org.elasticsearch', name: 'elasticsearch-spark-20_2.11', version: '5.1.2'
    compile group: 'com.typesafe.play', name: 'play-json_2.11', version: '2.4.10'

答案 2 :(得分:0)

如果您使用的是最新的Spark版本3.0.0-preview2,则以下配置是有效的build.sbt

name := "coursera"

version := "0.1"

scalaVersion := "2.12.10"
val sparkVersion = "3.0.0-preview2"
val playVersion="2.8.1"

val jacksonVersion="2.10.1"

//override if you wish to
//dependencyOverrides += "com.fasterxml.jackson.core" % "jackson-core" % jacksonVersion
//dependencyOverrides += "com.fasterxml.jackson.core" % "jackson-databind" % jacksonVersion

libraryDependencies ++= Seq(
  "org.apache.spark" %% "spark-streaming" % sparkVersion,
  "org.apache.spark" %% "spark-core" % sparkVersion,
  "org.apache.spark" %% "spark-sql" % sparkVersion,
  "com.typesafe.play" %% "play-json" % playVersion
)