使用Spark创建Row类型RDD时遭遇Jackson版本不兼容异常求助
问题原因与解决方案
这个异常的核心原因是Jackson版本不兼容,和你代码里的RDD创建逻辑无关,也不是遗漏了Spark的必要配置。
具体原因分析
Spark 2.2.1内部依赖的是Jackson 2.6.x系列的版本,但你的项目环境中出现了更高版本的Jackson(2.10.2),两者在Scala模块的兼容性上存在问题,导致Spark初始化RDDOperationScope时触发了JSON映射异常。
解决步骤
你可以通过以下几种方式修复这个版本冲突问题:
1. 检查依赖树定位冲突源
先执行SBT命令查看完整的依赖树,找出哪个第三方依赖引入了Jackson 2.10.2:
sbt dependencyTree
这样能精准定位到需要排除冲突的依赖项。
2. 排除冲突的Jackson依赖
在你的Spark依赖中手动排除自带的Jackson模块,然后引入Spark 2.2.1兼容的版本:
val spark2Version = "2.2.1" val compatibleJacksonVersion = "2.6.7" // Spark 2.2.1官方适配的Jackson版本 libraryDependencies ++= Seq( "org.apache.spark" %% "spark-core" % spark2Version, "org.apache.spark" %% "spark-sql" % spark2Version, "org.apache.spark" %% "spark-streaming" % spark2Version ).map(dep => dep .exclude("com.fasterxml.jackson.core", "jackson-databind") .exclude("com.fasterxml.jackson.core", "jackson-core") .exclude("com.fasterxml.jackson.core", "jackson-annotations") .exclude("com.fasterxml.jackson.module", "jackson-module-scala_2.11") ) // 引入兼容版本的Jackson库 libraryDependencies ++= Seq( "com.fasterxml.jackson.core" % "jackson-databind" % compatibleJacksonVersion, "com.fasterxml.jackson.core" % "jackson-core" % compatibleJacksonVersion, "com.fasterxml.jackson.core" % "jackson-annotations" % compatibleJacksonVersion, "com.fasterxml.jackson.module" %% "jackson-module-scala" % compatibleJacksonVersion )
3. 强制指定Jackson版本(更简便的方式)
如果不想逐个排除依赖,可以用SBT的dependencyOverrides强制全局使用兼容的Jackson版本:
val spark2Version = "2.2.1" val compatibleJacksonVersion = "2.6.7" libraryDependencies ++= Seq( "org.apache.spark" %% "spark-core" % spark2Version, "org.apache.spark" %% "spark-sql" % spark2Version, "org.apache.spark" %% "spark-streaming" % spark2Version ) // 强制所有依赖使用指定的Jackson版本 dependencyOverrides ++= Seq( "com.fasterxml.jackson.core" % "jackson-databind" % compatibleJacksonVersion, "com.fasterxml.jackson.core" % "jackson-core" % compatibleJacksonVersion, "com.fasterxml.jackson.core" % "jackson-annotations" % compatibleJacksonVersion, "com.fasterxml.jackson.module" %% "jackson-module-scala" % compatibleJacksonVersion )
验证修复
修改完依赖配置后,重新执行你的代码,应该就能正常创建Row类型的RDD并打印count结果了。
内容的提问来源于stack exchange,提问作者supernatural
相关产品推荐
相关产品推荐

