Тип несоответствия: невозможно преобразовать из Iterator в Java Spark

Исключение в streamе «main» java.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 / code:

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

Вы должны либо обновить зависимость Spark до 2.x, либо сохранить текущий код, либо использовать FlatMapFunction совместимую с ветвью 1.x :

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

Проблема уже должна быть видна в вашей (Eclipse?) IDE красными строками и предупреждением о том, что ваш источник содержит ошибки до того, как вы действительно выполните программу. Eclipse прекрасно позволяет вам работать в любом случае и включает код, который выдает «проблему неразрешенных компиляций», если вы нажмете на код, который имеет проблему.

Исключение указывает, что вы передаете Iterator<> то время как вызывающий метод ожидает Iteratable<> , то есть объект, который реализует этот интерфейс, и имеет метод iterator() который возвращает Iterator .