如何在Spark中对类中的某些字段应用reduceByKey?

时间:2015-03-10 11:29:05

标签: scala apache-spark

在这个场景中,我有一个JavaBean类,如下所示:

class JB implements Serializable {
  private String field_a;
  private String field_b;
  private String field_c;

  // getter & setter
  ...

  // toString
  ...
}

我在Spark中有一个RDD,它的元素是JB Class的实例。我打算做的是在这个RDD上应用reduceByKey,其中,(field_a,field_b)是必需的密钥。

有没有一个体面的方法来实现这一目标?非常感谢!

2 个答案:

答案 0 :(得分:0)

reduceByKey接受一个函数,该函数聚合RDD<T>类型的两个元素并生成一个:reduceByKey: (T,T) => T。请注意,此函数应该是关联的。那就是:(a+b)+c = a+(b+c)

在这种特定情况下,该功能应如下所示:f(JB,JB) => JB

rdd.reduceByKey(
  new Function2<JB, JB, JB>() {
    public JB call(JB a, JB b) { 
       JB res = add(a,b)
       return res;
    }
});

答案 1 :(得分:0)

 //lets say we have a RDD<JB>, identified by jbRdd

 RDD<JB> newRdd = jbRdd
     .groupBy( new Function1<JB, String>() {
         public String call( JB jb ) {
             // return a string formed by both keys
             return "$$fieldA$" + jb.getFieldA() + "$$fieldB" + jb.getFieldB();
         }
     } )
     .reduce( new Function2<JB, JB, JB>() {
         public JB call( JB jb1, JB jb2 ) {
             // create your newJb using jb1 and jb2 however you like.
             return newJb;
         }    
     } );