несоответствие типа искры: невозможно преобразовать из JavaRDD в JavaRDD

#java #apache-spark #java-8

#java #apache-spark #java-8

Вопрос:

Я начал писать свое приложение Pyspark для реализации Java. Я использую Java 8. Я только начал выполнять некоторые базовые программы spark на Java. Я использовал следующий пример wordcount .

 SparkConf conf = new SparkConf().setMaster("local").setAppName("Work Count App");

// Create a Java version of the Spark Context from the configuration
JavaSparkContext sc = new JavaSparkContext(conf);

JavaRDD<String> lines = sc.textFile(filename);

JavaPairRDD<String, Integer> counts = lines.flatMap(line -> Arrays.asList(line.split(" ")))
                    .mapToPair(word -> new Tuple2(word, 1))
                    .reduceByKey((x, y) -> (Integer) x   (Integer) y)
                    .sortByKey();
  

Я получаю Type mismatch: cannot convert from JavaRDD<Object> to JavaRDD<String> ошибку в lines.flatMap(line -> Arrays.asList(line.split(" ")))
Когда я гуглил, во всех примерах spark на основе Java 8 я видел ту же реализацию, что и выше.Что пошло не так в моей среде или программе.

Может ли кто-нибудь мне помочь?

Комментарии:

1. Является sc JavaSparkContext экземпляром.

2. @Ravikumar, да, это JavaSparkContext.

Ответ №1:

Используйте этот код. Фактическая проблема заключается в том, что функция rdd.flatMap ожидает Iterator<String> во время создания вашего кода List<String> . Вызов итератора() устранит проблему.

 JavaPairRDD<String, Integer> counts = lines.flatMap(line -> Arrays.asList(line.split(" ")).iterator())
            .mapToPair(word -> new Tuple2<String, Integer>(word, 1))
            .reduceByKey((x, y) ->  x    y)
            .sortByKey();

counts.foreach(data -> {
        System.out.println(data._1() "-" data._2());
    });
  

Комментарии:

1. Не могли бы вы добавить одну строку объяснения

2. @Backtrack Я добавил детали.

Ответ №2:

попробуйте этот код

 JavaRDD<String> words =
    lines.flatMap(line -> Arrays.asList(line.split(" ")));
JavaPairRDD<String, Integer> counts =
    words.mapToPair(w -> new Tuple2<String, Integer>(w, 1))
         .reduceByKey((x, y) -> x   y);
  

Ответ №3:

 JavaRDD<String> obj = jsc.textFile("<Text File Path>");
JavaRDD<String> obj1 = obj.flatMap(l->{
ArrayList<String> al = new ArrayList();
String[] str = l.split(" ");
for(int i=0;i<str/length;i  ) {
    al.add(str[i]);
}
return al.iterator();
});
  

Комментарии:

1. Было бы здорово, если бы вы могли записать полезный комментарий в своем ответе.

Ответ №4:

Попробуйте это :

  JavaRDD<String> words = input.flatMap(
                new FlatMapFunction<String, String>() {
                    public Iterator<String> call(String s) {
                        return (Arrays.asList(s.split(" ")).iterator());
                    }
                } );