【问题标题】:spark Type mismatch: cannot convert from JavaRDD<Object> to JavaRDD<String>spark 类型不匹配:无法从 JavaRDD<Object> 转换为 JavaRDD<String>
【发布时间】:2016-10-18 07:38:48
【问题描述】:

我已经开始将我的 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();

我在 lines.flatMap(line -&gt; Arrays.asList(line.split(" "))) 中收到 Type mismatch: cannot convert from JavaRDD&lt;Object&gt; to JavaRDD&lt;String&gt; 错误 当我用谷歌搜索时,在所有基于 Java 8 的 spark 示例中,我看到了与上述相同的实现。我的环境或程序出了什么问题。

有人可以帮我吗?

【问题讨论】:

  • sc 一个JavaSparkContext 实例。
  • @Ravikumar,是的,它是 JavaSparkContext。

标签: java apache-spark java-8


【解决方案1】:

使用此代码。实际问题是 rdd.flatMap 函数需要 Iterator&lt;String&gt;,而您的代码正在创建 List&lt;String&gt;。调用 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 我已经添加了详细信息。
【解决方案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();
    });
    

    【讨论】:

    • 如果您能在回答中写下有用的评论,那就太好了。
    【解决方案4】:

    试试这个:

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

    【讨论】:

      猜你喜欢
      • 2017-02-25
      • 2019-12-23
      • 1970-01-01
      • 2016-07-24
      • 2016-04-08
      • 1970-01-01
      • 2019-09-29
      • 2020-06-01
      • 2021-04-12
      相关资源
      最近更新 更多