2017-04-17 72 views
0

火花,我可以應用過濾器的RDD來創建一個新的一個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上心。你也可以讓代碼看起來更好用lambdas。

UPD2: 與lambda表達式邏輯塊可能看起來像:

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

是否可以說明一點的代碼?我是初學者,現在對我來說沒什麼意義:) – SpiderRico

+0

謝謝,我明白了。但是,語法是錯誤的,我無法弄清楚。我嘗試類似:JavaPairRDD瓦爾斯= SC \t \t \t \t .parallelize(Arrays.asList(10,15,0)) \t \t \t \t .zipWithIndex(); \t \t JavaPairRDD valsGreaterThan5 =瓦爾斯 \t \t \t .filter((K,V) - > V> 5) \t \t \t .MAP((K,V) - > k)的; – SpiderRico

相關問題