如何获取满足过滤器的值的索引?

时间:2017-04-17 18:55:45

标签: java apache-spark

在Spark中,我可以将一个过滤器应用于RDD以创建新的过滤器。该RDD的每个元素都满足过滤器,如下所示:

JavaRDD<Integer> vals = sc.parallelize(Arrays.asList(10, 15, 0, 6, 2));
    JavaRDD<Integer> valsGreaterThan5 = vals.filter(new Function<Integer, Boolean>() {
        public Boolean call(Integer x) {
            if (x > 5)
                return true;
            else
                return false;
        }
    });

所以,这段代码将返回一个包含10,15和6的新RDD。但是,如果我想获取它们的索引,我该怎么办呢?所以我没有 10,15和6 ,而是希望他们的索引 0,1,3。

1 个答案:

答案 0 :(得分:0)

您可以从<index, value>对创建RDD,因此您可以按值进行过滤,然后从对映射到索引。

UPD: 像这样的东西(我附近没有Spark所以无法确保它是否编译):

     JavaPairRDD<Integer> vals = sc.parallelize(Arrays.asList(
      new Tuple2(0, 10),
      new Tuple2(1, 15), 
      new Tuple2(2, 0), 
      new Tuple2(3, 6), 
      new Tuple2(4, 2)));
    JavaRDD<Integer> valsGreaterThan5 = vals.filter(new Function<Tuple2<Integer, Integer>, Boolean>() {
        public Boolean call(Tuple2<Integer, Integer> x) {
            return (x._2 > 5);
        }
    }).map(new Function<Tuple2<Integer, Integer>, Integer>() {
        public Boolean call(Tuple2<Integer, Integer> x) {
           return x._1;
        }
    });

我希望你能得到这个主意。你也可以使用lambdas使代码看起来更好。

UPD2:  使用lambdas逻辑块可能看起来像:

JavaRDD<Integer> valsGreaterThan5 = vals
    .filter((x) -> x._2 > 5)
    .map((x) -> x._1);