Idea运行时Scala报错Exception in thread "main" java.lang.NoSuchMethodError:com.google.common.base.Preconditions.checkArgument(ZLjava/lang/String;Ljava/lang/Object;)V
阅读原文时间:2023年07月08日阅读:1

一.情况描述

使用idea +scala+spark,运行程序代码如下:

package cn.idcast.hello

import org.apache.spark.rdd.RDD
import org.apache.spark
import org.apache.spark.SparkConf
import org.apache.spark.SparkContext

/**
* Author itcast
* Desc 演示Spark入门案例-WordCount
*/
object WordCount_bak {
def main(args: Array[String]): Unit = {
//TODO 1.env/准备sc/SparkContext/Spark上下文执行环境
val conf: SparkConf = new SparkConf().setAppName("wc").setMaster("local[*]")
val sc: SparkContext = new SparkContext(conf)
sc.setLogLevel("WARN")

//TODO 2.source/读取数据  
//RDD:A Resilient Distributed Dataset (RDD):弹性分布式数据集,简单理解为分布式集合!使用起来和普通集合一样简单!  
//RDD\[就是一行行的数据\]  
val lines: RDD\[String\] = sc.textFile("data/input/words.txt")

//TODO 3.transformation/数据操作/转换  
//切割:RDD\[一个个的单词\]  
val words: RDD\[String\] = lines.flatMap(\_.split(" "))  
//记为1:RDD\[(单词, 1)\]  
val wordAndOnes: RDD\[(String, Int)\] = words.map((\_,1))  
//分组聚合:groupBy + mapValues(\_.map(\_.\_2).reduce(\_+\_)) ===>在Spark里面分组+聚合一步搞定:reduceByKey  
val result: RDD\[(String, Int)\] = wordAndOnes.reduceByKey(\_+\_)

//TODO 4.sink/输出  
//直接输出  
result.foreach(println)  
//收集为本地集合再输出  
println(result.collect().toBuffer)  
//输出到指定path(可以是文件/夹)  
result.repartition(1).saveAsTextFile("data/output/result")  
result.repartition(2).saveAsTextFile("data/output/result2")  
result.saveAsTextFile("data/output/result3")

//为了便于查看Web-UI可以让程序睡一会  
Thread.sleep(1000 \* 60)

//TODO 5.关闭资源  
sc.stop()  

}
}

(忘记截图)结果报错:Exception in thread "main" java.lang.NoSuchMethodError:com.google.common.base.Preconditions.checkArgument(ZLjava/lang/String;Ljava/lang/Object;)V

网上说是,jar包冲突,但是并没有解决问题


二.解决方案

问题根源:windows的scala版本与spark自带的scala版本不一致,如图所示:

这是spark自带的版本为2.12.10

而我在windows装的是2.12.11(忘记截图),后来更换为2.12.10(重新安装:IDEA安装配置Scala环境):

之后运行成功,没有报错

最近老是遇到这种版本错误,难受

参考文章:https://www.pianshen.com/article/1399177290/