Spark DataFrame写入Parquet文件报NoSuchMethodError问题求助
解决Spark 2.4.0写入Parquet时的json4s方法缺失错误
这个问题我之前帮不少开发者排查过,本质就是依赖版本冲突搞的鬼:你遇到的java.lang.NoSuchMethodError是因为Spark 2.4.0内置的json4s版本,和你引入的com.databricks.spark.csv依赖带的json4s版本不兼容,导致调用JsonMethods$.render方法时找不到匹配的方法签名。
两种可行的解决方案
方案一:强制统一json4s版本(适合必须保留databricks csv包的场景)
Spark 2.4.0官方依赖的json4s版本是3.5.3,你可以通过强制覆盖项目依赖来确保所有模块都使用这个版本,避免冲突。如果是Scala+sbt项目,修改你的build.sbt:
// 你的现有依赖 libraryDependencies ++= Seq( "com.databricks" % "spark-csv_2.11" % "1.5.0" // 注意要选和Spark 2.4.0兼容的版本 ) // 强制统一json4s所有模块的版本 dependencyOverrides ++= Seq( "org.json4s" %% "json4s-core" % "3.5.3", "org.json4s" %% "json4s-jackson" % "3.5.3", "org.json4s" %% "json4s-scalap" % "3.5.3" )
修改后记得清理依赖缓存(执行sbt clean),重新构建项目再运行作业。
方案二:改用Spark内置CSV读取器(更推荐)
Spark 2.4.0已经原生支持CSV数据源,完全不需要再引入第三方的com.databricks.spark.csv包,直接用官方提供的API就能读取CSV,还能彻底避免依赖冲突:
// 替换原来的读取代码 val deltaTableInput1 = spark.read .option("header", "true") .option("delimiter", "|") .option("inferSchema", "true") .csv("你的CSV文件路径") // 写入Parquet的代码保持不变 deltaTableInput1.write.mode("overwrite").format("parquet").save("你的Parquet输出路径")
这个方案更省心,因为官方内置的数据源和Spark版本完全适配,没有额外依赖的烦恼。
验证步骤
- 清理项目的依赖缓存(比如sbt/maven的clean命令)
- 重新构建项目,确保所有依赖都正确下载并统一版本
- 重新运行你的Spark作业,检查写入Parquet是否正常
内容的提问来源于stack exchange,提问作者Raptor0009
相关产品推荐
相关产品推荐

