Spark连接MongoDB加载数据遇ClassNotFoundException报错求助
解决Spark连接MongoDB时的ClassNotFoundException问题
问题根源
你遇到的java.lang.ClassNotFoundException是因为缺少MongoDB Spark Connector的Java依赖包。仅通过pip install pyspark pymongo只能安装Python端的依赖,而Spark连接MongoDB需要专门的Java连接器(mongo-spark-connector),它负责实现com.mongodb.spark.sql.DefaultSource这个数据源类。
解决方案
1. 启动SparkSession时自动加载连接器依赖(推荐)
在构建SparkSession时,通过spark.jars.packages参数指定连接器的Maven坐标,Spark会自动下载并加载对应的JAR包。需要根据你的Spark版本、Scala版本选择匹配的连接器版本:
- Spark 3.x 通常搭配Scala 2.12,对应连接器版本如
org.mongodb.spark:mongo-spark-connector_2.12:10.3.1(适配MongoDB 5.0+) - 确保版本兼容:连接器版本需要和你的Spark、MongoDB版本匹配(比如Spark 3.4用Connector 10.3.x,Spark 3.3用10.2.x)
2. 修正后的完整代码
from pyspark.sql import SparkSession from pyspark.sql.functions import col # 构建SparkSession,添加MongoDB连接器依赖 spark = SparkSession.builder \ .appName("MongoDB Spark Connector Example") \ .config("spark.jars.packages", "org.mongodb.spark:mongo-spark-connector_2.12:10.3.1") \ .config("spark.mongodb.input.uri", "mongodb://<HOST>:<PORT>/<DB>.<COLLECTION>") \ # 如果MongoDB需要认证,添加以下配置 # .config("spark.mongodb.input.auth.username", "<USERNAME>") \ # .config("spark.mongodb.input.auth.password", "<PASSWORD>") \ .getOrCreate() season_year = "1996" team_abbreviation = "CHH" # 加载MongoDB数据 df = spark.read.format("mongodb").load() # 旧版本连接器可使用:format("com.mongodb.spark.sql.DefaultSource"),新版本推荐直接用"mongodb" # 筛选数据 filtered_df = df.filter((col("season") == season_year) & (col("TEAM_ABBREVIATION") == team_abbreviation)) # 选择指定字段 selected_columns = ["AGE", "W", "L", "DD2", "TD3", "PLUS_MINUS"] selected_df = filtered_df.select(*selected_columns) selected_df.show()
3. 注意事项
- 替换代码中的
<HOST>、<PORT>、<DB>、<COLLECTION>为你的MongoDB实际信息 - 如果使用MongoDB云服务(如Atlas),URI格式应为
mongodb+srv://<USERNAME>:<PASSWORD>@<CLUSTER_URL>/<DB>.<COLLECTION> - 若连接器版本不匹配,可能会出现其他兼容性错误,需根据你的环境选择对应版本
内容的提问来源于stack exchange,提问作者Altin Mag.
相关产品推荐
相关产品推荐

