Spark:从List <object> RDD创建对象RDD

时间:2016-05-26 13:23:19

标签: java apache-spark rdd

假设Employee是Java类。

我有一个JavaRDD<Employee[]> arrayOfEmpList,即每个RDD都有array of employees

除此之外,我想创建一个员工列表,例如

JavaRDD<Employee>

这是我试过的: 创建了List<Employee> empList = new ArrayList<Employee>();

然后foreach员工的RDD []:

arrayOfEmpList.forEach(new VoidFunction<Employee[]>(){
public void call(Employee[] arg0){
   empList.addAll(Arrays.asList(arg0));
   System.out.println(empList.size()); //prints correct values incrementally
}
});

System.out.println(empList.size()); //gives 0

我无法获得foreach循环之外的大小。

还有其他方法可以达到这个目的吗?

P.S:我希望将所有员工记录作为单独的RDD,因此第一个员工列表可能包含10个记录,第二个可能包含100个记录,第三个可能包含200个记录。我想要一个330条记录的最终列表,然后我可以并行化并执行操作。

1 个答案:

答案 0 :(得分:1)

您需要的是阵列上的flatMap转换。我首先将您的员工数组转换为列表:

JavaRDD<Employee> employeeRDD = arrayOfEmployeeList.flatMap(empArray -> Arrays.asList(empArray));

检查,也许该方法有一个直接接受数组的重载,而不仅仅是一个集合。

您可以在编程指南的转换部分看到这一点:http://spark.apache.org/docs/latest/programming-guide.html#transformations

JavaDocs:http://spark.apache.org/docs/latest/api/java/org/apache/spark/api/java/JavaRDDLike.html#flatMap(org.apache.spark.api.java.function.FlatMapFunction)