在这个场景中,我有一个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)是必需的密钥。
有没有一个体面的方法来实现这一目标?非常感谢!
答案 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;
}
} );