当前位置: 首页 > 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模拟“中断“处理流程
  • 【知识碎片】第三方登录弹窗效果
  • Brief introduction of how to 'Call, Apply and Bind'
  • Java反射-动态类加载和重新加载
  • mysql外键的使用
  • Mysql优化
  • niucms就是以城市为分割单位,在上面 小区/乡村/同城论坛+58+团购
  • node.js
  • PHP CLI应用的调试原理
  • Puppeteer:浏览器控制器
  • SpringBoot 实战 (三) | 配置文件详解
  • thinkphp5.1 easywechat4 微信第三方开放平台
  • 翻译:Hystrix - How To Use
  • 个人博客开发系列:评论功能之GitHub账号OAuth授权
  • 后端_MYSQL
  • 前端每日实战:70# 视频演示如何用纯 CSS 创作一只徘徊的果冻怪兽
  • 浅谈Kotlin实战篇之自定义View图片圆角简单应用(一)
  • 深度学习在携程攻略社区的应用
  • 限制Java线程池运行线程以及等待线程数量的策略
  • 教程:使用iPhone相机和openCV来完成3D重建(第一部分) ...
  • ​LeetCode解法汇总2696. 删除子串后的字符串最小长度
  • $$$$GB2312-80区位编码表$$$$
  • $forceUpdate()函数
  • (echarts)echarts使用时重新加载数据之前的数据存留在图上的问题
  • (Java)【深基9.例1】选举学生会
  • (java)关于Thread的挂起和恢复
  • (LeetCode) T14. Longest Common Prefix
  • (Matlab)遗传算法优化的BP神经网络实现回归预测
  • (八)Spring源码解析:Spring MVC
  • (附源码)ssm考试题库管理系统 毕业设计 069043
  • (三)c52学习之旅-点亮LED灯
  • (十)DDRC架构组成、效率Efficiency及功能实现
  • (十一)JAVA springboot ssm b2b2c多用户商城系统源码:服务网关Zuul高级篇
  • (转)EOS中账户、钱包和密钥的关系
  • (转)iOS字体
  • (转)关于如何学好游戏3D引擎编程的一些经验
  • (转载)Linux网络编程入门
  • (自适应手机端)响应式新闻博客知识类pbootcms网站模板 自媒体运营博客网站源码下载
  • .NET Compact Framework 3.5 支持 WCF 的子集
  • .NET Core 中插件式开发实现
  • .NET/C# 利用 Walterlv.WeakEvents 高性能地中转一个自定义的弱事件(可让任意 CLR 事件成为弱事件)