You need to enable JavaScript to run this app. 使用Scala从Docker部署的MongoDB读数据到Spark返回0条记录,是什么原因?
优惠活动
大模型
产品
解决方案
定价
更多

使用Scala从Docker部署的MongoDB读数据到Spark返回0条记录,是什么原因?

Spark读取MongoDB返回空DataFrame解决方案
  • 首先排查端口配置错误:当前脚本中Mongo服务端口填的是8081,该端口默认是Mongo Express可视化面板的Web端口,MongoDB数据库服务默认监听端口为27017,请先确认你的MongoDB服务实际监听端口,将mongoServerName中的端口替换为正确的数据库端口。
  • 验证连接有效性:优先使用Mongo Shell验证账号权限、连接地址是否正确,执行如下命令:
mongo "mongodb://xyz:xyz@<Mongo服务IP>:<正确端口>/mydb?authSource=mydb"
# 进入库后执行计数验证
use mydb
db.myCollection.count()

如果返回结果不是24,说明连接地址、账号权限存在问题,先修复该部分问题再调试Spark代码。

  • 检查Mongo Spark连接器版本匹配:不同Spark版本对应不同的连接器版本,需保证版本兼容:
    • Spark 3.x 对应连接器版本10.x+,启动任务时需指定对应依赖,例如Scala 2.12环境下添加启动参数:--packages org.mongodb.spark:mongo-spark-connector_2.12:10.2.1
    • Spark 2.x 对应连接器版本2.4.x,对应依赖为:--packages org.mongodb.spark:mongo-spark-connector_2.11:2.4.3
  • 排查Docker网络连通性:如果Spark运行在Docker容器中,先进入容器执行nc -zv host.docker.internal <Mongo端口>验证网络连通,不通的话可以替换为宿主机器的实际局域网IP测试。
  • 可选:手动指定Schema避免自动推断失败,示例如下:
import org.apache.spark.sql.types._
val customSchema = StructType(Seq(
  StructField("_id", StringType, nullable = true),
  StructField("你的字段1", StringType, nullable = true),
  StructField("你的字段2", IntegerType, nullable = true)
  // 按实际集合字段补全
))
val mongoDf = spark.read.format("com.mongodb.spark.sql.DefaultSource")
.option("uri", mongoConnectionString)
.schema(customSchema)
.load()
  • 无认证环境适配:如果你的MongoDB未开启身份认证,直接去掉连接字符串中的账号密码部分,修改为:mongodb://$mongoServerName/$mongoDbName.$mongoCollection

内容的提问来源于stack exchange,提问作者Shantanu Gupta

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.09 08:39:02