如何从JavaPairRDD中删除空数据

时间:2016-03-21 09:21:24

标签: apache-spark

我正在获取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对中删除这个空条目?

1 个答案:

答案 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。