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