【问题标题】:Spark : Creating Object RDD from List<Object> RDDSpark:从 List<Object> RDD 创建对象 RDD
【发布时间】:2016-05-26 13:23:19
【问题描述】:

假设 Employee 是一个 Java 类。

我有一个JavaRDD&lt;Employee[]&gt; arrayOfEmpList,即每个RDD都有一个array of employees

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

JavaRDD<Employee>

这是我尝试过的: 创建了List&lt;Employee&gt; empList = new ArrayList&lt;Employee&gt;();

然后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 条记录的最终列表,然后我可以对其进行并行化并执行操作。

【问题讨论】:

    标签: java apache-spark rdd


    【解决方案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)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-08-11
      • 2019-02-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-15
      • 2017-08-08
      相关资源
      最近更新 更多