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

Другие вопросы по тегам