PySpark写入MongoDB失败求助:版本兼容问题排查
问题:PySpark写入MongoDB触发NoSuchMethodError错误
问题重现
尝试用以下代码将DataFrame写入MongoDB时失败:
df_load.write.format("com.mongodb.spark.sql.DefaultSource").mode("append").save()
报错信息
运行时触发如下错误:
Py4JJavaError: An error occurred while calling o41.save. : java.lang.NoSuchMethodError: 'scala.collection.mutable.ArrayOps scala.Predef$.refArrayOps(java.lang.Object[])'...(完整报错栈信息同原文)
环境版本
- Spark: 3.4.1
- Scala: 2.12
- Java: 20
当前PySpark配置
working_directory = 'D:/jars/*' spark = SparkSession\ .builder\ .appName('ml')\ .config("spark.mongodb.input.uri","mongodb://localhost:27017/test.spark")\ .config("spark.mongodb.output.uri","mongodb://localhost:27017/test.spark")\ .config('spark.driver.extraClassPath', working_directory).getOrCreate()
问题分析
这个错误本质是依赖版本不兼容:
- MongoDB Spark Connector的Scala编译版本与当前Spark依赖的Scala 2.12不匹配;
- Connector版本与Spark 3.4.1版本不兼容;
- Java 20属于非LTS版本,Spark 3.4.x对其支持为实验性,存在兼容性隐患。
解决方案
1. 匹配MongoDB Spark Connector版本
Spark 3.4.x必须搭配MongoDB Spark Connector 10.2.x系列(编译为Scala 2.12),对应关系如下:
- Spark 3.x → Connector 10.x系列
- 确保下载的Connector jar是
mongo-spark-connector_2.12-10.2.0.jar,同时需要配套的驱动jar:mongodb-driver-sync-4.10.2.jar、mongodb-driver-core-4.10.2.jar。 - 将这些jar单独放在
D:/jars/目录,删除目录内其他无关jar,避免依赖冲突。
2. 降级Java版本
Spark 3.4.x官方推荐使用Java 8或11(LTS版本),Java 20支持不完善,建议:
- 安装Java 11,修改系统环境变量
JAVA_HOME指向Java 11安装目录; - 重启项目后验证Java版本:
java -version。
3. 修正Spark类路径配置
避免通配符导致的依赖加载问题,直接指定具体jar路径:
working_directory = 'D:/jars/mongo-spark-connector_2.12-10.2.0.jar;D:/jars/mongodb-driver-sync-4.10.2.jar;D:/jars/mongodb-driver-core-4.10.2.jar' spark = SparkSession\ .builder\ .appName('ml')\ .config("spark.mongodb.input.uri","mongodb://localhost:27017/test.spark")\ .config("spark.mongodb.output.uri","mongodb://localhost:27017/test.spark")\ .config('spark.driver.extraClassPath', working_directory)\ .config('spark.executor.extraClassPath', working_directory) # 集群模式需添加 .getOrCreate()
4. 使用简化的写入代码
Connector 10.x版本推荐使用更简洁的format("mongodb")替代旧类名:
df_load.write \ .format("mongodb") \ .mode("append") \ .option("uri", "mongodb://localhost:27017/test.spark") \ .save()
内容的提问来源于stack exchange,提问作者Nguyễn Quốc Mạnh
相关产品推荐
相关产品推荐

