如何解决此错误“类型不匹配:无法从List <string>转换为Iterator <string>”

时间:2019-01-14 12:28:40

标签: java apache-spark java-8

我是java8和spark的新手,试图在Java中执行简单的平面图转换程序,但是我在倒数第二行Arrays.asList(e.split(" ")));的平面图转换中遇到了一些错误,错误是

  

类型不匹配:无法从List<String>转换为Iterator<String>

什么是适合此问题的解决方案。 预先感谢

 import java.util.Arrays;
 import java.util.List;

 import org.apache.spark.SparkConf;
 import org.apache.spark.api.java.JavaRDD;
 import org.apache.spark.api.java.JavaSparkContext;
 import org.apache.commons.lang.StringUtils;

 public class FlatMapExample {
           public static void main(String[] args) throws Exception {
    SparkConf sparkConf = new 
          SparkConf().setMaster("local").setAppName("filter 
          transformation");
    JavaSparkContext sc = new JavaSparkContext(sparkConf);



    // Parallelized with 2 partitions
    JavaRDD<String> rddX = sc.parallelize(
            Arrays.asList("spark rdd example", "sample example"),
            2);

    // map operation will return List of Array in following case
    JavaRDD<String[]> rddY = rddX.map(e -> e.split(" "));

    List<String[]> listUsingMap = rddY.collect();
    for(int i = 0; i < listUsingMap.size(); i++)
    {
        System.out.println("list.."+StringUtils.join(listUsingMap.get(i)));
    }
    //System.out.println("listUsingMap..."+listUsingMap.collect());

    // flatMap operation will return list of String in following case
    JavaRDD<String> rddY2 = rddX.flatMap(e -> Arrays.asList(e.split(" ")));
    List<String> listUsingFlatMap = rddY2.collect();
}

}

2 个答案:

答案 0 :(得分:3)

您应该指定您至少使用版本2.0,其中FlatMapFunction::call实际上返回Iterator而不是Iterable(例如在1.6中就是这种情况) 。因此,假设您的rddX.flatMap返回一个Iterator<String>,而Arrays.asList(e.split(" "))返回一个List<String>

但是您可以使用List::iterator,例如:

 rddX.flatMap(e -> Arrays.asList(e.split(" ")).iterator())

答案 1 :(得分:0)

我想多说明一点,希望对您和其他面临相同问题的人有所帮助。

rdd.flatMap((e -> Arrays.asList(e.split(" "))) 在saprk 1.6和 在spark 2.0中

rddX.flatMap(e -> Arrays.asList(e.split(" ")).iterator()) 是正确的。

下面是flatMap方法签名,它使用FlatMapFunction作为参数。

public <U> JavaRDD<U> flatMap(FlatMapFunction<T, U> f)

Spark 1.6 FlatMapFunction

call方法返回Iterable

@FunctionalInterface
public interface FlatMapFunction<T, R> extends Serializable {
   Iterable<R> call(T t) throws Exception
}

Spark 2.0 FlatMapFunction

调用方法返回Iterator

@FunctionalInterface
public interface FlatMapFunction<T, R> extends Serializable {
    Iterator<R> call(T var1) throws Exception;
}

因此,这意味着spark 1.6中的flatMap方法需要一个lambda表达式(java 8),该表达式返回Iterable,而在Spark 2.0中要求返回类型为Iterator。

现在

rddX.flatMap(e-> Arrays.asList(e.split(“”)))

Arrays.asList(e.split(" "))返回一个java.util.List并且List是一个Iterable。

列表实现Collection

public interface List<E> extends Collection<E>

Collection实现Iterable。

public interface Collection<E> extends Iterable<E>

因此在Spark 1.6中,Arrays.asList()可以正常工作,但在Spark 2.0中,需要进一步在此List上调用iterator()以获得Iterator。

Arrays.asList(e.split(" ")).iterator()