Scala 模块 2.10.0 需要 Jackson Databind 版本 >= 2.10.0 且 < 2.11.0

Vad*_*dim 3 scala jackson apache-spark

我有一个 sbt 项目,我想使用 scala 测试和共享 Spark 会话进行测试。几周前,我的项目开始出错。

java.lang.ExceptionInInitializerError
    at org.apache.spark.sql.execution.SparkPlan.executeQuery(SparkPlan.scala:215)
    at org.apache.spark.sql.execution.SparkPlan.execute(SparkPlan.scala:176)
.....
Caused by: com.fasterxml.jackson.databind.JsonMappingException: Scala module 2.10.0 requires Jackson Databind version >= 2.10.0 and < 2.11.0
    at com.fasterxml.jackson.module.scala.JacksonModule.setupModule(JacksonModule.scala:61)
    at com.fasterxml.jackson.module.scala.JacksonModule.setupModule$(JacksonModule.scala:46)
Run Code Online (Sandbox Code Playgroud)

有一个非常简单的测试

import org.apache.spark.sql.QueryTest.checkAnswer
import org.apache.spark.sql.Row
import org.apache.spark.sql.test.SharedSparkSession

class SparkTestSpec extends SharedSparkSession  {
  import testImplicits._
  test("join - join using") {
    val df = Seq(1, 2, 3).toDF("int")

    checkAnswer(df, Row(1) :: Row(2) :: Row(3) :: Nil)
  }
}
Run Code Online (Sandbox Code Playgroud)

和 sbt 配置

ThisBuild / scalaVersion := "2.12.10"
val sparkVersion = "3.1.0"
val scalaTestVersion = "3.2.1"

libraryDependencies ++= Seq(
  "org.apache.spark" %% "spark-sql" % sparkVersion,
  "org.apache.spark" %% "spark-sql" % sparkVersion % Test,
  "org.apache.spark" %% "spark-sql" % sparkVersion % Test classifier "tests",
  "org.apache.spark" %% "spark-catalyst" % sparkVersion % Test,
  "org.apache.spark" %% "spark-catalyst" % sparkVersion % Test classifier "tests",
  "org.apache.spark" %% "spark-hive" % sparkVersion % Test,
  "org.apache.spark" %% "spark-hive" % sparkVersion % Test classifier "tests",
  "org.apache.spark" %% "spark-core" % sparkVersion,
  "org.apache.spark" %% "spark-core" % sparkVersion % Test classifier "tests",
  "log4j" % "log4j" % "1.2.17",
  "org.slf4j" % "slf4j-log4j12" % "1.7.30",

  "org.scalatest" %% "scalatest" % scalaTestVersion % Test,
  "org.scalatestplus" %% "scalacheck-1-14" % "3.2.2.0",

)
Run Code Online (Sandbox Code Playgroud)

Gaë*_*l J 5

这是杰克逊的一个非常经典的问题。该错误告诉您,您需要在所有依赖项中使用单一版本的 Jackson,但事实并非如此。

通常,您有 Spark 和另一个库以不同的版本传递 Jackson。

你需要做的是:

  • 运行sbt dependencyTree以确定哪个库正在拉取 Jackson 以及哪个版本
  • 定义一个dependencyOverrides强制所有 Jackson 库使用相同的 Jackson 版本(哪个版本由您决定,具体取决于与需要它的其他库的兼容性)