类型不匹配:无法从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.call
是java.util.Iterator
call(T t) - 在Spark 1.x中,
FlatMapFunction.call
是Iterable
。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()
。