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

如何在HDP 2.6的Zeppelin中通过Spark2读取MongoDB集合?

在HDP 2.6环境中通过Zeppelin的Spark2解释器读取MongoDB集合的解决方案

我来帮你搞定这个场景下的MongoDB读取问题,结合你给出的环境信息(Scala 2.11.8、Spark 2.2.0、MongoDB 3.4.14,使用mongo-spark-connector 2.2.2 + mongo-java-driver 3.5.0),这些版本搭配是完全兼容的,接下来咱们一步步解决:

第一步:确保Zeppelin Spark2解释器加载了正确的依赖

在Zeppelin的Spark2解释器配置页面,找到Dependencies部分,添加以下两个依赖(可以直接用Maven坐标,或者指定本地jar包路径):

  • org.mongodb.spark:mongo-spark-connector_2.11:2.2.2(注意_2.11要和你的Scala版本对应)
  • org.mongodb:mongo-java-driver:3.5.0

添加完成后,一定要重启Spark2解释器,否则依赖不会生效。

第二步:修正并运行读取代码

你之前的代码没写完,而且可以简化一下(Zeppelin的Spark2解释器已经自动初始化了SparkSession,不用写spark.sparkSession),这里给出两种完整的可运行代码:

方式一:通过URI直接指定数据库和集合

// 导入必要的包
import org.apache.spark.sql.mongodb.MongoSpark
import com.mongodb.spark.config.ReadConfig

// 配置读取参数,指定读偏好为secondaryPreferred
val customReadConfig = ReadConfig(Map(
  "readPreference.name" -> "secondaryPreferred",
  "uri" -> "mongodb://127.0.0.1:27017/test.collections"
))

// 加载MongoDB集合为DataFrame
val df5 = MongoSpark.load(spark, customReadConfig)

// 验证读取结果,显示前10条数据
df5.show()
// 查看集合的Schema结构
df5.printSchema()

方式二:分开指定数据库和集合(更直观)

如果觉得URI里写库和集合不够清晰,可以拆分参数:

import org.apache.spark.sql.mongodb.MongoSpark
import com.mongodb.spark.config.ReadConfig

val customReadConfig = ReadConfig(Map(
  "readPreference.name" -> "secondaryPreferred",
  "uri" -> "mongodb://127.0.0.1:27017/",
  "database" -> "test",
  "collection" -> "collections"
))

val df5 = MongoSpark.load(spark, customReadConfig)
df5.show()

注意事项

  1. MongoDB认证处理:如果你的MongoDB开启了用户名密码认证,需要在URI中添加认证信息,比如:
    mongodb://username:password@127.0.0.1:27017/test.collections?authSource=admin
    
  2. 网络连通性:确保Zeppelin所在的节点能够访问MongoDB的27017端口,防火墙规则要开放对应端口。
  3. 依赖版本匹配:千万不要搞错connector的Scala版本后缀,比如你的Scala是2.11,就不能用_2.12的connector包,否则会出现类找不到的错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 08:28:02