我有一个用JavaRDD编写的正在工作的Spark作业。现在,我想将输出移至数据帧,而无需对现有代码进行太多更改。我的意图是通过使用sqlContext将RDD转换为数据帧。但是不建议使用,因此我正在使用SparkSession创建SparkContext,后来使用它将RDD转换为数据帧。
我的问题是RDD对上的reduceBykey
不再起作用。尽管在编译时没有错误,但执行时会失败,并显示IllegalAccessError
错误,可以通过我的代码中的reduceByKey
调用追溯到该行。
这是错误
Exception in thread "main" java.lang.IllegalAccessError: tried to access method com.google.common.base.Stopwatch.<init>()V from class org.apache.hadoop.mapred.FileInputFormat
下面是代码段
SparkSession spark = SparkSession
.builder()
.appName("test")
.master("local")
.getOrCreate();
SparkContext sc = spark.sparkContext();
JavaRDD<String> lineInput = spark.sparkContext()
.textFile("/tmp/test.txt", 1)
.toJavaRDD();
JavaPairRDD<String, String> pairInput = lineInput
.mapToPair(new FlatRDDToPairRDD());
//FlatRDDToPairRDD class takes a string and returns a Tuple
JavaPairRDD<String, String> reducedPair = pairInput.reduceByKey(new TestReducer());
JavaRDD<String> outputRDD = reducedPair.map(new
PairRDDToFlatValueRDD());
//PairRDDToFlatValueRDD takes a Tuple and returns as string
这是我对pom文件的依赖
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-sql_2.11</artifactId>
<version>2.3.1</version>
</dependency>
还有其他人遇到类似的问题吗?有关如何进行的一些提示会有所帮助。