Spark: создание объекта RDD из списка<Object> RDD
Предполагать Employee
это класс Java
у меня есть JavaRDD<Employee[]> arrayOfEmpList
каждый СДР имеет 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.
Есть ли другой способ достичь этого?
PS: я хочу, чтобы все записи о сотрудниках были отдельными СДР, поэтому 1-й список сотрудников может содержать 10 записей, 2-й может содержать 100 записей, 3-й может содержать 200 записей. Я хочу получить окончательный список из 330 записей, которые затем можно распараллелить и выполнить действия.
1 ответ
Что вам нужно, так это flatMap
преобразование в вашем массиве. Сначала я преобразовываю ваш массив сотрудников в список:
JavaRDD<Employee> employeeRDD = arrayOfEmployeeList.flatMap(empArray -> Arrays.asList(empArray));
Проверьте, возможно, метод имеет перегрузку, которая принимает массив напрямую, а не просто коллекцию.
Вы можете увидеть это в разделе преобразований руководства по программированию: http://spark.apache.org/docs/latest/programming-guide.html
JavaDocs: http://spark.apache.org/docs/latest/api/java/org/apache/spark/api/java/JavaRDDLike.html