Spark 2.4.4+Scala2.12写入DataFrame为Delta表时Jackson报错求助
解决Spark 2.4.4 + Scala 2.12写入Delta表时的Jackson方法缺失错误
我之前也踩过这个坑!这个java.lang.NoSuchMethodError本质就是Jackson版本冲突在搞事情:Spark 2.4.4自带的Jackson库版本和Delta Lake依赖的Jackson Scala模块版本不兼容,Delta需要的初始化方法在Spark自带的旧版Jackson里根本不存在。
下面是我亲测有效的解决步骤,按优先级来:
1. 用对Delta Lake的兼容版本是关键
Spark 2.4.x系列只能搭配Delta Lake的0.6.x版本(更高的0.7+版本是给Spark 3.x准备的,别乱升级)。
如果是sbt项目,直接在build.sbt里指定:
libraryDependencies += "io.delta" %% "delta-core" % "0.6.1" % Provided
要是用spark-submit提交作业,记得带上Delta的包:
spark-submit --packages io.delta:delta-core_2.12:0.6.1 your-job.jar
2. 排除项目里的冲突Jackson依赖
如果你的项目自己引入了Jackson相关包,大概率会和Spark自带的版本打架。这时候要把Delta依赖里的Jackson相关包排除掉,让它用Spark自带的兼容版本。比如sbt里这么写:
libraryDependencies += "io.delta" %% "delta-core" % "0.6.1" % Provided excludeAll( ExclusionRule(organization = "com.fasterxml.jackson.core"), ExclusionRule(organization = "com.fasterxml.jackson.module") )
3. 检查依赖树确认版本统一
可以用sbt dependencyTree(sbt项目)或者spark-shell --packages io.delta:delta-core_2.12:0.6.1 --verbose来查看依赖树,看看Jackson相关包是不是有多个版本共存。要是有,就得手动调整依赖优先级,确保只有兼容的版本在运行时生效。
另外,写代码的时候,记得正确引入Delta的包(虽然0.6.x版本不需要额外注册SparkSession的扩展,但引入包能避免一些隐性问题):
import io.delta.tables._ import org.apache.spark.sql.SparkSession val spark = SparkSession.builder() .appName("DeltaWriteJob") .getOrCreate() val df = spark.read.load("path/to/your/parquet") df.write.format("delta").mode("overwrite").save("path/to/delta-table")
内容的提问来源于stack exchange,提问作者Raptor0009
相关产品推荐
相关产品推荐

