2017-11-08 8 views
0

リスト値でJavaPairedRDDでイテレーターを試行しています。各エントリを繰り返し処理したいのですが、常に値リストのすべての要素を繰り返し処理しているようです。たとえば、私はこのようにpairedRDDを持っています。JavaPairRDDでリスト値でマップする

[(0,[date, date, date]), (1,[str, str, str]), (2,[str, str, str]), (3,[str, int, str]), (4,[int, int, int]), (5,[float, float, int]), (6,[float, float, float])] 

そして、私はペアの各エントリの値に最も共通の要素を抽出したいと思います。このため、私は望みます

[date, str, str, str, int, float, float] 

どうすればいいですか?私が試した試みはいくつかリストアップしますが、値のすべての要素を繰り返しています。私は、リストのための最も一般的な要素を返す関数を定義し、これを試してみました:

JavaRDD<String> resultrdd = pair_rdd.map(e -> mostCommon(e._2)); 

この

JavaRDD<String> result = pair_rdd.flatMap(new FlatMapFunction<Tuple2<Integer, List<String>>, String>(){ 

    @Override 
    public Iterator<String> call(Tuple2<Integer, List<String>> t) throws Exception { 
      List<String> result = new ArrayList<String>(); 
      // TODO Auto-generated method stub 
      List<String> type = t._2; 
      result.add(mostCommon(type)); 
      return result.iterator(); 
     } 

}); 

ので

[date, str, str, str, int, float, float,date, str, int, str, int, float, float,date, str, str, str, int, int, float] 

リスト内のすべての要素に起因するすべての、私はe._2はリスト全体を参照するのではなく、リストの各要素を参照していると考えてください。どんな助け?

編集:私の最も一般的な方法です。 「なし」がある場合は、もう一方のタイプを優先します。

public static <String> String mostCommon(List<String> list) { 
    Map<String, Integer> map = new HashMap<>(); 

    for (String t : list) { 
     Integer val = map.get(t); 
     map.put(t, val == null ? 1 : val + 1); 
    } 

    Entry<String, Integer> max = null; 

    for (Entry<String, Integer> e : map.entrySet()) { 
     if (e.getKey().equals("None")==false) { 
      if (max == null || e.getValue() > max.getValue()) 
       max = e; 
     } 
    } 
    if(max==null) { 
     return (String) "None"; 
    }else { 
     return max.getKey(); 
    } 
} 

答えて

0

あなたはmap、ないflatMapをしたいです。あなたは、単一の要素にタプルを変換するネストされたリストに

を平坦ではないそして、あなたはちょうど私がe._2が

、全体のリストを参照されていないと思うが、単一の文字列を返し

を想定し、return mostCommon(t._2)する必要があります

リスト全体である必要があります。そうでなければ、これはあなたの最初の7つの要素が正しいので、私はあなたのRDDに余分なデータを持っていると思う

List<String> type = t._2; 

をコンパイルしません

+0

最初の7は右ですが、以下のエントリを見れば、彼らは最初のものとは異なる。 date、str、int、str、int、float、float。これは次の7つの要素です。そして私がそう考えている理由のもう一つは、着信rddの長さを印刷すると7ですが、結果rddは21です。私はそれが各要素を通過していると思います。 –

+0

最初のアプローチは、マップを使用して正しいものですか? –

+0

最初のものが正しいと思われます。あなたのmostCommon関数がどのように見えるか、それが返すものは明確ではありません。 –