Как решить эту ошибку «Несоответствие типов: невозможно преобразовать из списка <String>в итератор <String>» - PullRequest
0 голосов
/ 14 января 2019

Я новичок в 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 голосов
/ 12 июня 2019

Я хотел бы объяснить немного больше, надеюсь, будет полезно для вас и других, кто сталкивается с той же проблемой.

rdd.flatMap((e -> Arrays.asList(e.split(" "))) правильно в свече 1.6 и в спарк 2.0.

rddX.flatMap(e -> Arrays.asList(e.split(" ")).iterator()) правильно.

Ниже приведена сигнатура метода flatMap, которая принимает FlatMapFunction в качестве параметра.

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

Функция Spark 1.6 FlatMap

метод вызова возвращает Iterable

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

Функция Spark 2.0 FlatMap

метод вызова возвращает итератор

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

Итак, это означает, что методу flatMap в spark 1.6 требуется лямбда-выражение (java 8), которое возвращает Iterable, а в Spark 2.0 требуемый тип возвращаемого значения - Iterator.

Теперь

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

Arrays.asList(e.split(" ")) возвращает java.util.List, а List является итерируемым.

Список инвентаря Коллекция

public interface List<E> extends Collection<E>

Коллекция реализует Iterable.

public interface Collection<E> extends Iterable<E>

Так что в Spark 1.6 Arrays.asList() работает нормально, но в Spark 2.0 необходимо дополнительно вызвать iterator () для этого списка, чтобы получить Iterator.

Arrays.asList(e.split(" ")).iterator()
0 голосов
/ 14 января 2019

Вы должны были указать, что используете хотя бы версию 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())
...