Spark:从 List<Object> RDD 创建对象 RDD
Spark : Creating Object RDD from List<Object> RDD
假设 Employee
是 Java Class。
我有一个 JavaRDD<Employee[]> arrayOfEmpList
,即每个 RDD 都有一个 array of employees
。
除此之外,我想创建一个员工列表,例如
JavaRDD<Employee>
这是我尝试过的:
创建了 List<Employee> empList = new ArrayList<Employee>();
然后foreach Employee[]的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 条记录的最终列表,然后我可以对其进行并行处理并对其执行操作。
您需要的是对数组进行 flatMap
转换。我首先将您的员工数组转换为列表:
JavaRDD<Employee> employeeRDD = arrayOfEmployeeList.flatMap(empArray -> Arrays.asList(empArray));
检查,也许该方法有一个重载,直接接受一个数组,而不仅仅是一个集合。
您可以在编程指南的转换部分看到:http://spark.apache.org/docs/latest/programming-guide.html#transformations
假设 Employee
是 Java Class。
我有一个 JavaRDD<Employee[]> arrayOfEmpList
,即每个 RDD 都有一个 array of employees
。
除此之外,我想创建一个员工列表,例如
JavaRDD<Employee>
这是我尝试过的:
创建了 List<Employee> empList = new ArrayList<Employee>();
然后foreach Employee[]的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 条记录的最终列表,然后我可以对其进行并行处理并对其执行操作。
您需要的是对数组进行 flatMap
转换。我首先将您的员工数组转换为列表:
JavaRDD<Employee> employeeRDD = arrayOfEmployeeList.flatMap(empArray -> Arrays.asList(empArray));
检查,也许该方法有一个重载,直接接受一个数组,而不仅仅是一个集合。
您可以在编程指南的转换部分看到:http://spark.apache.org/docs/latest/programming-guide.html#transformations