我正在获取Hbase数据,并尝试对其进行一项火花工作。我的表格大约有70,000行,每行都有一个“类型”列,其中包含以下值:发布,评论或回复。基于类型,我想取出如下所示的不同配对RDD(用于发布)。
JavaPairRDD<ImmutableBytesWritable, FlumePost> postPairRDD = hBaseRDD.mapToPair(
new PairFunction<Tuple2<ImmutableBytesWritable, Result>, ImmutableBytesWritable, FlumePost>() {
private static final long serialVersionUID = 1L;
public Tuple2<ImmutableBytesWritable, FlumePost> call(Tuple2<ImmutableBytesWritable, Result> arg0)
throws Exception {
FlumePost flumePost = new FlumePost();
ImmutableBytesWritable key = arg0._1;
Result result = arg0._2;
String type = Bytes.toString(result.getValue(Bytes.toBytes("cf"), Bytes.toBytes("t")));
if (type.equals("post")) {
return new Tuple2<ImmutableBytesWritable, FlumePost>(key, flumePost);
} else {
return null;
}
}
}).distinct();
这里的问题是,对于所有类型不是 post 的行,我必须发送不需要的空值。对于所有三种类型,迭代持续70k次,浪费了周期。所以我的第一个问题是:
1)这样做的有效方法是什么?
所以现在在获得70k结果后,我使用distinct()
方法删除了空值的重复。所以我最终得到一个空值对象。我期望20327的结果,但我得到20328.
2)有没有办法从RDD对中删除这个空条目?
答案 0 :(得分:2)
您可以在RDD上使用filter
操作。
只需致电:
.filter(new Function<Tuple2<ImmutableBytesWritable, FlumePost>, Boolean>() {
@Override
public Boolean call(Tuple2<ImmutableBytesWritable, FlumePost> v1) throws Exception {
return v1 != null;
}
})
在致电distinct()
之前过滤掉null
s。