在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。
答案 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);