我是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();
}
}
答案 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()