Scala 2.13搭配Spark3.3.0用MSSQL连接器报NoSuchMethodError求解决
Scala 2.13 + Spark 3.3.0 下 MSSQL 插入报错的解决办法
这个NoSuchMethodError本质是Scala 2.12与2.13的集合API二进制不兼容导致的。你使用的MSSQL Spark连接器基于Scala 2.12编译,其中调用了scala.collection.immutable.Map.$plus方法,但Scala 2.13对集合API做了底层调整,该方法的签名和实现已发生变化,导致运行时无法找到对应方法。
以下是可行的解决办法:
方案1:使用Spark原生JDBC写入(最推荐)
放弃专用的MSSQL Spark连接器,直接用Spark自带的JDBC数据源。Spark 3.3.0对Scala 2.13的支持完善,原生JDBC可直接适配,无需额外依赖。
替换后的代码示例:
import org.apache.spark.sql.SaveMode df.write .format("jdbc") .mode(SaveMode.Append) .option("driver", "com.microsoft.sqlserver.jdbc.SQLServerDriver") .option("url", jdbcUrl) .option("dbtable", "mytable") .option("user", "你的数据库用户名") .option("password", "你的数据库密码") .option("batchsize", "1000") // 可选,调整批量插入大小优化性能 .save()
注意:原生JDBC不支持MSSQL连接器的部分高级特性(如分区并行写入、自动schema映射优化),但基础的插入、更新功能完全可用。
方案2:自行编译适配Scala 2.13的连接器版本
如果必须使用专用连接器的高级特性,可以自行修改源码编译适配Scala 2.13:
- 获取MSSQL Spark连接器的官方源码
- 修改项目构建文件(如sbt的
build.sbt),将Scala版本改为2.13.8(与Spark 3.3.0兼容的版本),同时调整Spark依赖版本为3.3.0 - 修复源码中Scala 2.13不兼容的代码(主要是集合API的变化,比如调整
Map + (key -> value)这类写法的实现) - 执行编译命令生成适配Scala 2.13的jar包,替换项目中原来的连接器依赖
方案3:临时降级Scala到2.12
如果以上方案都无法实施,降级Scala到2.12是最省心的临时方案——连接器本身就是为Scala 2.12编译的,完全兼容,不会出现API不匹配的问题。
内容的提问来源于stack exchange,提问作者Shalaj
相关产品推荐
相关产品推荐

