当前位置: 首页 > news >正文

Spark 链接 Mongodb 报错:java.lang.NoSuchFieldError: UNSPECIFIED

这两天写 spark 的各种连接器,今天连接 mongodb 的时候遇到了一个很稀少的错误,这里记录一下,同时给遇到相同问题的朋友提供一个解决方案。

spark connect mongodb

这里是我写的一个简单的测试:

	val mongoUrl="mongodb://192.168.*.***/"
    val database="XXX"
    val dbCollection="XXXXXX"
    val  port = 27017

    // TODO: 方法一
    val spark = SparkSession.builder()
      .master("local[*]")
      .appName("ReadMongodb")
      .config("spark.mongodb.input.uri", mongoUrl)
      .config("spark.mongodb.input.database", database)
      .config("spark.mongodb.input.collection", dbCollection)
      .getOrCreate()

    val frame = MongoSpark.load(spark)
    frame.printSchema()
    frame.createTempView("table")
    val res = spark.sql("select * from table limit 10")
    res.show()

	// TODO: 方法二
    val collection = new StructType()
      .add("_id", DataTypes.StringType)
      .add("deviceCode", DataTypes.StringType)
      .add("funCode", DataTypes.StringType)
      .add("deptId", DataTypes.StringType)
      .add("deptName", DataTypes.StringType)
      .add("monthId", DataTypes.StringType)
      .add("mountName", DataTypes.StringType)
      .add("deviceId", DataTypes.StringType)
      .add("pointId", DataTypes.StringType)
      .add("pointOrderNum", DataTypes.StringType)
      .add("value", DataTypes.StringType)
      .add("pointDisplayName", DataTypes.StringType)
      .add("unit", DataTypes.StringType)
      .add("pointName", DataTypes.StringType)
      .add("originName", DataTypes.StringType)
      .add("originTime", DataTypes.StringType)
      .add("createTime", DataTypes.StringType)
      .add("_class", DataTypes.StringType)

    val session = SparkSession.builder().master("local").appName("test").getOrCreate()
    val table = session.read.schema(collection)
      .format("com.mongodb.spark.sql")
      .option("spark.mongodb.input.uri", mongoUrl + database + "." + dbCollection)
      .option("spark.mongodb.input.batchSize", 1000)
      .option("spark.mongodb.input.partitioner", "MongoPaginateByCountPartitioner")
      .option("spark.mongodb.input.partitionerOptions.partitionKey", "_id")
      .option("spark.mongodb.input.partitionerOptions.numberOfPartitions", 32)
      .load().createTempView("table")

    session.sql("select * from table limit 10").toDF().printSchema()

error message

经过测试,代码是没有任何问题的,但是无论哪种方法都会有一个报错:

Exception in thread “main” java.lang.NoSuchFieldError: UNSPECIFIED

具体报错信息如图:
在这里插入图片描述
信息意思是配置不完全,配置信息不明确!
网上找了好多帖子都没有类似情况的,然后微信上请教了他人;奇怪的是,类似的代码,他的能跑,我的就是有报错。

solution

最后我觉得应该不是代码的问题,会不会是依赖版本的问题。
尝试降低了 mongo-spark-connector 依赖的版本,果然不报错了,问题解决。

    <!-- https://mvnrepository.com/artifact/org.mongodb.spark/mongo-spark-connector -->
    <dependency>
      <groupId>org.mongodb.spark</groupId>
      <artifactId>mongo-spark-connector_2.12</artifactId>
      <version>3.0.0</version>
    </dependency>

版本降低至 2.4 即可

    <!-- https://mvnrepository.com/artifact/org.mongodb.spark/mongo-spark-connector -->
    <dependency>
      <groupId>org.mongodb.spark</groupId>
      <artifactId>mongo-spark-connector_2.12</artifactId>
      <version>2.4.0</version>
    </dependency>

总结:版本不匹配问题,究竟为什么,具体我也讲不出,有大佬知道的,欢迎找我探讨。

相关文章:

  • 使用交易量份额(SOTV)来评估 DEXs
  • Elasticsearch 7和Elastic Stack:深入实践
  • DSPE-PEG-R8, DSPE-PEG-RRRRRRRR,磷脂-聚乙二醇-八精氨酸
  • 基于QT和C++实现的停车场管理系统
  • 遍历map的四种方法及Map.entry详解
  • 阿里云付哲:边缘云技术创新 让“云”无处不在
  • springboot基于微信小程序的选课系统毕业设计源码060000
  • ESP8266-Arduino编程实例-VEML6075紫外线(UV)光传感器驱动
  • 内核态和用户态
  • 学习笔记(9)JavaScript元素、节点
  • 2022届秋招Java岗高频面试题盘点,老司机也未必全会,真的太卷了
  • 飞机机场城市标签 易语言代码
  • 遍历Map集合、修改Map集合中的value值
  • Tapdata 杨哲轩:如何在零售行业实施主数据治理?
  • POSIX线程使用signal模拟“中断“处理流程
  • 【跃迁之路】【735天】程序员高效学习方法论探索系列(实验阶段492-2019.2.25)...
  • Angular2开发踩坑系列-生产环境编译
  • centos安装java运行环境jdk+tomcat
  • CentOS学习笔记 - 12. Nginx搭建Centos7.5远程repo
  • C语言笔记(第一章:C语言编程)
  • JavaScript学习总结——原型
  • LintCode 31. partitionArray 数组划分
  • Meteor的表单提交:Form
  • React中的“虫洞”——Context
  • Redux 中间件分析
  • vue和cordova项目整合打包,并实现vue调用android的相机的demo
  • Vue小说阅读器(仿追书神器)
  • windows下如何用phpstorm同步测试服务器
  • 百度贴吧爬虫node+vue baidu_tieba_crawler
  • 对话 CTO〡听神策数据 CTO 曹犟描绘数据分析行业的无限可能
  • 对话:中国为什么有前途/ 写给中国的经济学
  • 飞驰在Mesos的涡轮引擎上
  • 码农张的Bug人生 - 见面之礼
  • 每天一个设计模式之命令模式
  • 如何进阶一名有竞争力的程序员?
  • 世界上最简单的无等待算法(getAndIncrement)
  • 主流的CSS水平和垂直居中技术大全
  • 阿里云服务器如何修改远程端口?
  • ​Linux·i2c驱动架构​
  • (13)Latex:基于ΤΕΧ的自动排版系统——写论文必备
  • (delphi11最新学习资料) Object Pascal 学习笔记---第8章第2节(共同的基类)
  • (done) 两个矩阵 “相似” 是什么意思?
  • (动态规划)5. 最长回文子串 java解决
  • (附表设计)不是我吹!超级全面的权限系统设计方案面世了
  • (附源码)ssm失物招领系统 毕业设计 182317
  • (黑马C++)L06 重载与继承
  • (剑指Offer)面试题41:和为s的连续正数序列
  • (论文阅读26/100)Weakly-supervised learning with convolutional neural networks
  • (论文阅读笔记)Network planning with deep reinforcement learning
  • (收藏)Git和Repo扫盲——如何取得Android源代码
  • (四)Tiki-taka算法(TTA)求解无人机三维路径规划研究(MATLAB)
  • (一)appium-desktop定位元素原理
  • (转)Linux整合apache和tomcat构建Web服务器
  • (转)视频码率,帧率和分辨率的联系与区别
  • ***原理与防范