Spark Mongo Connector 10.2.1使用objectOrArrayOnly报错求助
问题
使用Spark Mongo Connector 10.2.1版本,通过spark-submit的--jars参数传入依赖包,运行时出现以下错误:
Caused by: com.mongodb.spark.sql.connector.exceptions.ConfigException: 'objectOrArrayOnly' is not a valid Convert Json Type at com.mongodb.spark.sql.connector.config.WriteConfig$ConvertJson.fromString(WriteConfig.java:96) at com.mongodb.spark.sql.connector.config.WriteConfig.convertJson(WriteConfig.java:298) at com.mongodb.spark.sql.connector.write.MongoDataWriter.<init>(MongoDataWriter.java:74) at com.mongodb.spark.sql.connector.write.MongoDataWriterFactory.createWriter(MongoDataWriterFactory.java:53) at org.apache.spark.sql.execution.datasources.v2.DataWritingSparkTask$.run(WriteToDataSourceV2Exec.scala:408) at org.apache.spark.sql.execution.datasources.v2.V2TableWriteExec.$anonfun$writeWithV2$2(WriteToDataSourceV2Exec.scala:360) at org.apache.spark.scheduler.ResultTask.runTask(ResultTask.scala:90) at org.apache.spark.scheduler.Task.run(Task.scala:131) at org.apache.spark.executor.Executor$TaskRunner.$anonfun$run$3(Executor.scala:497) at org.apache.spark.util.Utils$.tryWithSafeFinally(Utils.scala:1439) at org.apache.spark.executor.Executor$TaskRunner.run(Executor.scala:500) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) at java.lang.Thread.run(Thread.java:750) Caused by: java.lang.IllegalArgumentException: No enum constant com.mongodb.spark.sql.connector.config.WriteConfig.ConvertJson.OBJECTORARRAYONLY at java.lang.Enum.valueOf(Enum.java:238) at com.mongodb.spark.sql.connector.config.WriteConfig$ConvertJson.valueOf(WriteConfig.java:73) at com.mongodb.spark.sql.connector.config.WriteConfig$ConvertJson.fromString(WriteConfig.java:94)
查看10.2.1版本源码,发现ConvertJson枚举中包含objectOrArrayOnly选项:
public static enum ConvertJson { FALSE("false"), ANY("any"), OBJECT_OR_ARRAY_ONLY("objectOrArrayOnly"); private final String value; private static final String TRUE = "true"; private ConvertJson(String operationType) { this.value = operationType; } static ConvertJson fromString(String jsonType) { if (jsonType.equalsIgnoreCase("true")) { WriteConfig.LOGGER.warn("{}: '{}' is deprecated. Use: '{}' instead.", new Object[]{"convertJson", "true", ANY}); return ANY; } else { try { return valueOf(jsonType.toUpperCase(Locale.ROOT)); } catch (IllegalArgumentException var2) { throw new ConfigException(String.format("'%s' is not a valid Convert Json Type", jsonType), var2); } } } public String toString() { return this.value; } }
怀疑实际运行时未使用指定的10.2.1版本,该如何解决?
解决方案
排查依赖冲突:
执行spark-submit时添加--verbose参数,查看运行时加载的Mongo Connector版本。或者在代码中添加以下代码打印实际加载的版本:println("Mongo Spark Connector Version: " + com.mongodb.spark.sql.connector.config.Version.getVersion)确认是否存在旧版本依赖被优先加载的情况。
强制指定版本优先级:
使用--jars传入依赖时,确保10.2.1版本的jar包路径正确,且没有其他旧版本的Mongo Connector jar包在Spark的classpath中。如果是集群环境,检查集群节点的spark/jars目录是否存在旧版本jar包,如有则删除或替换为10.2.1版本。使用
--packages替代--jars:
放弃手动传入jar包,改用spark-submit的--packages参数自动拉取指定版本的依赖,避免手动管理jar包的版本冲突问题:spark-submit --packages org.mongodb.spark:mongo-spark-connector_2.12:10.2.1 ...(其他参数)注意根据你的Scala版本调整
_2.12部分(例如Scala 2.11对应_2.11)。检查配置参数的拼写:
确认代码或配置文件中convertJson参数的值是objectOrArrayOnly,注意大小写和下划线,避免拼写错误。虽然源码中支持该值,但如果参数写错也会触发类似错误。清理缓存:
清理Spark的本地缓存目录(默认是./spark-warehouse或指定的临时目录),以及Maven/Ivy的本地仓库中旧版本的Mongo Connector依赖,确保拉取的是最新的10.2.1版本。
内容的提问来源于stack exchange,提问作者Sateesh K

