2017-04-17 9 views
0

は、私は次のようにそのRDDの各要素がフィルタの基準を満たす新しい1 1 STを作成するために、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; 
     } 
    }); 

ので、このコードは私に新しいRDDが返されますが含まれています10、15、6です。インデックスを取得するにはどうすればいいですか?だからではなく10、15と6の、私は0、1ですそのインデックスは、欲しい3.

答えて

0

あなたは値によってフィルタリングすることができますよりもので、ペア<index, value>からRDDを作成し、マップすることができますペアからインデックスへ

UPD:このような 何か(それはコンパイルする場合、私が保証することはできませんので、私の近くにスパークを持っていない):

 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; 
     } 
    }); 

私はあなたHAVAは、アイデアを得たいと考えています。また、lambdaを使ってコードをもっとよく見せることができます。

UPD2:ラムダ・ロジック・ブロックと できたように見えます:

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

それはコードを少し説明することは可能ですか?私は初心者で、これは現時点で私にはあまり意味がありません:) – SpiderRico

+0

ありがとう私は考えを得た。しかし、構文は間違っており、わかりません。 \t \t \t \t .parallelize(は、Arrays.asList(10、15、0)) \t \t \t \t .zipWithIndex()皮下JavaPairRDDのヴァルス=;:私のような何かを試してみてください \t \t JavaPairRDD valsGreaterThan5 =ヴァルス \t \t \t .filter((K、V) - > V> 5) \t \t \t .MAP((K、V) - > K)。 – SpiderRico

関連する問題