类型不匹配:无法从Java Spark中的Iterator 转换

线程“main”中的exceptionjava.lang.Error:未解决的编译问题:类型不匹配:无法从Iterator转换为Iterable

在com.spark.wordcount.lession1.WordCount2.main(WordCount2.java:26)

SparkConf conf = new SparkConf().setAppName("cust data").setMaster("local[*]"); JavaSparkContext sc = new JavaSparkContext(conf); JavaRDD lines = sc.textFile("C:\\\\Users\\\\dell\\\\Desktop\\\\simple_text_file.txt"); JavaRDD words = lines.flatMap(s -> Arrays.asList(SPACE.split(s)).iterator()); JavaPairRDD ones = words.mapToPair(s -> new Tuple2(s, 1)); JavaPairRDD counts = ones.reduceByKey((i1, i2) -> i1 + i2); List<Tuple2> output = counts.collect(); for (Tuple2 tuple : output) { System.out.println(tuple._1() + ": " + tuple._2()); } 

您正在混合不兼容的Spark /代码版本:

  • 在Spark 2.x中FlatMapFunction.calljava.util.Iterator call(T t)
  • 在Spark 1.x中, FlatMapFunction.callIterable call(T t)

您应该将Spark依赖项升级到2.x并保留当前代码或使用与1.x分支兼容的 FlatMapFunction

 JavaRDD words = lines.flatMap(new FlatMapFunction() { @Override public Iterable call(String s) { return Arrays.asList(SPACE.split(s)); } }); 

问题应该已经在你的(Eclipse?)IDE中通过红色的squiqly行显示, 并且在实际执行程序之前警告你的源包含错误。 Eclipse很好地让你无论如何都可以运行,并包含如果你遇到有问题的代码就会抛出“未解决的编译问题”的代码。

exception表示您正在传递Iterator<>而调用方法需要Iteratable<> ,这是一个实现该接口的对象,并且具有返回Iterator的方法iterator()