使用MongoDB Spark Connector读取数据时遇showString调用错误求助
问题描述
我使用以下Python代码通过Spark从MongoDB读取数据并转换为DataFrame:
from pyspark.sql import SparkSession # Initialize a Spark session spark = SparkSession.builder \ .appName("MongoDB Spark Connector Example") \ .config("spark.mongodb.read.connection.uri", "mongodb://localhost:23017/") \ .config("spark.mongodb.read.database", "db_name") \ .config("spark.mongodb.read.collection", "coll_name") \ .config("spark.sql.debug.maxToStringFields", 1000) \ .getOrCreate() df = spark.read.format("mongodb").load() df.createOrReplaceTempView("temp") sqlDf = spark.sql("SELECT id from temp") sqlDf.show()
我的环境版本信息:
- Spark版本:3.2.4
- MongoDB版本:6
- Scala版本:2.12.15
- Java版本:1.8
- Python版本:3.8
- Ubuntu版本:20.04
- mongo-spark-connector_2.12版本:10.2.0
运行代码使用的命令:
spark-submit --packages org.mongodb.spark:mongo-spark-connector_2.12:10.2.0 test.py
运行时出现以下错误:
py4j.protocol.Py4JJavaError: An error occurred while calling o67.showString. : java.lang.NoSuchMethodError: org.apache.spark.sql.types.StructType.toAttributes()Lscala/collection/immutable/Seq; at com.mongodb.spark.sql.connector.schema.InternalRowToRowFunction.<init>(InternalRowToRowFunction.java:46) at com.mongodb.spark.sql.connector.schema.RowToBsonDocumentConverter.<init>(RowToBsonDocumentConverter.java:84) at com.mongodb.spark.sql.connector.read.MongoScanBuilder.<clinit>(MongoScanBuilder.java:72) at com.mongodb.spark.sql.connector.MongoTable.newScanBuilder(MongoTable.java:121)
解决方案
该错误源于MongoDB Spark Connector版本与Spark版本不兼容:StructType.toAttributes()方法是Spark 3.3及以上版本新增的API,而你使用的Spark 3.2.4不包含此方法,Connector 10.2.0依赖Spark 3.3+,调用该API时就会抛出“方法不存在”的错误。
修复步骤:
- 替换为与Spark 3.2.x匹配的Connector版本:使用
mongo-spark-connector_2.12:10.1.1,该版本兼容Spark 3.2系列。 - 修改运行命令中的包依赖:
spark-submit --packages org.mongodb.spark:mongo-spark-connector_2.12:10.1.1 test.py
- 代码无需修改,保持原有SparkSession配置即可。
执行上述修改后,代码可正常读取MongoDB数据并执行SQL查询。
内容的提问来源于stack exchange,提问作者Gaurav Srivastava
相关产品推荐
相关产品推荐

