You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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()

问题分析

这个错误本质是依赖版本不兼容:

  1. MongoDB Spark Connector的Scala编译版本与当前Spark依赖的Scala 2.12不匹配;
  2. Connector版本与Spark 3.4.1版本不兼容;
  3. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 12:41:30