执行df.show()显示DataFrame内容时遇Jackson版本不兼容错误
解决Spark中
df.show()触发的Jackson版本不兼容问题 这个Jackson版本冲突的问题我之前在Spark项目里也碰到过,其实就是Spark自带的Jackson版本和你项目中引入的第三方依赖带的Jackson版本(2.8.9)不兼容导致的——df.show()在序列化RDD操作范围时会用到Jackson,版本不匹配就会抛出这个映射异常。下面给你一步步的解决思路:
先定位冲突来源
先搞清楚到底是哪个第三方依赖引入了Jackson 2.8.9。如果用SBT构建,运行命令:sbt dependencyTree如果是Maven,执行:
mvn dependency:tree在输出结果里搜索
com.fasterxml.jackson相关条目,找到绑定了2.8.9版本的那个依赖。排除冲突的Jackson依赖
找到那个问题依赖后,在你的构建文件里排除它自带的Jackson相关包。比如SBT里可以这么写:libraryDependencies += "问题依赖的groupId" % "问题依赖的artifactId" % "版本号" excludeAll( ExclusionRule(organization = "com.fasterxml.jackson.core"), ExclusionRule(organization = "com.fasterxml.jackson.module") )Maven的写法如下:
<dependency> <groupId>问题依赖的groupId</groupId> <artifactId>问题依赖的artifactId</artifactId> <version>版本号</version> <exclusions> <exclusion> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> </exclusion> <exclusion> <groupId>com.fasterxml.jackson.module</groupId> <artifactId>jackson-module-scala_2.11</artifactId> </exclusion> <!-- 可根据依赖树补充其他Jackson相关排除项 --> </exclusions> </dependency>强制统一Jackson版本(可选)
如果排除后还是有版本冲突,可以直接在构建文件里强制指定Spark兼容的Jackson版本:- Spark 2.4.x系列对应Jackson 2.6.7
- Spark 3.1.x及以上对应Jackson 2.10.x+
以SBT为例,添加依赖覆盖:
dependencyOverrides ++= Seq( "com.fasterxml.jackson.core" % "jackson-core" % "2.6.7", "com.fasterxml.jackson.core" % "jackson-databind" % "2.6.7", "com.fasterxml.jackson.core" % "jackson-annotations" % "2.6.7", "com.fasterxml.jackson.module" % "jackson-module-scala_2.11" % "2.6.7" )Maven则通过
<dependencyManagement>节点统一版本。验证并测试
修改完构建文件后,重新运行依赖树命令,确认所有Jackson相关依赖都统一为Spark兼容的版本,然后重新编译运行你的程序,再调用df.show()应该就能正常工作了。
内容的提问来源于stack exchange,提问作者ScalaBoy
相关产品推荐
相关产品推荐

