spark类型不匹配:无法从JavaRDD <object>转换为JavaRDD <string>

时间:2016-10-18 07:38:48

标签: java apache-spark java-8

我已经开始将我的Pyspark应用程序编写为Java实现。我正在使用Java 8.我刚开始在java中执行一些基本的spark progrma。我使用了以下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(" ")))错误 当我用Google搜索时,在所有基于Java 8的火花示例中,我看到了相同的上述实现。我的环境或程序出了什么问题。

有人可以帮助我吗?

4 个答案:

答案 0 :(得分:6)

使用此代码。当您的代码创建Iterator<String>时,实际问题是rdd.flatMap函数需要List<String>。调用iterator()将解决问题。

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 :(得分:0)

试试这段代码

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);

答案 2 :(得分:0)

vector

答案 3 :(得分:0)

尝试一下:

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