2016-07-25 5 views
1

私はJavaPairRDD<Integer, List<String>>に大きなリストを持っています。フラットマップを使ってリストエントリの可能な組み合わせをすべて得て、JavaPairRDD<Integer, Tuple2<String,String>>になります。私は大きなリストFlatMap Java Spark

(1, ["A", "B", "C"])

のようなものを持っている基本的にあれば私が取得したい:

(1, <"A","B">) (1, <"A", "C">) (1, <"B", "C")

問題は、私が持っていることによってTuple2オブジェクトの大規模なリストを作成しているやっていることと、大きなリストであります入力リストのネストされたループ時々このリストは記憶に収まらない。私はこれを見つけましたが、Javaでそれを実装する方法がわからない:どのように大きなに依存

JavaPairRDD<Integer, List<String>> original = // ... 
JavaPairRDD<Integer, String> flattened = original.flatMapValues(identity()); 
JavaPairRDD<Integer, Tuple2<String, String>> joined = flattened.join(flattened); 
JavaPairRDD<Integer, Tuple2<String, String>> filtered = 
    joined.filter(new Function<Tuple2<Integer, Tuple2<String, String>>, Boolean>() { 
     @Override 
     public Boolean call(Tuple2<Integer, Tuple2<String, String>> kv) throws Exception { 
      return kv._2()._1().equals(kv._2()._2()); 
     } 
    }); 

答えて

2

あなたはflatMapにしたいことのリストを、次にフィルタリング等しい値の前に自分自身にRDDに参加します私の仕事では通常、FlatMapとflatMapToPairを使用して100〜200GBのデータセットを処理しなければならず、両方とも高集計計算に適しています。

JavaPairRDD<Integer, List<String>>= DatasetsRDD. 
    .flatMapToPair(x->{ 
    return xx; 
    }); 

以下の例あなたのデータセットが巨大である場合にも、あなたがディスク

に、私はそれを作品逃しすべき
Storage Level 

    MEMORY_ONLY 
    MEMORY_ONLY_SER 
    MEMORY_AND_DISK_SER 
    DISK_ONLY 
    MEMORY_ONLY_2 

References: https://spark.apache.org/docs/latest/rdd-programming-guide.html 
+0

感謝をスパーク永続性を使用することを試みることができます。 – ilijaluve