Spark类型不匹配:无法将JavaRDD<Object>转换为JavaRDD<String>。

5

我已经开始将我的Pyspark应用程序转换为Java实现。我正在使用Java 8。我刚刚开始在Java中执行一些基本的spark程序。我使用了以下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的Spark示例中,我都看到了相同的实现方式。请问是我的环境或程序出了什么问题?

有没有人能帮助我解决这个问题呢?


sc 是一个 JavaSparkContext 实例吗? - Ravikumar
@Ravikumar,是的,它是JavaSparkContext。 - backtrack
4个回答

9
使用以下代码。实际问题在于rdd.flatMap函数需要Iterator<String>,而你的代码创建了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());
    });

请您添加一行解释。 - backtrack
1
@Backtrack 我已经添加了细节。 - abaghel

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

0

试试这个:

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

0
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
如果您能在回答中写下有用的评论,那将是非常好的。 - ajc

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接