2017-11-29 13 views
0

が、私はAnonymousPairと呼ばれるこの任意WritableComparable実装を持っていると私は「コピーコンストラクタ」を使用しない場合、私はこのMapReduceのリデューサ値をコピーする必要があります。 MapReduceのアプリケーションで

import com.google.common.collect.MinMaxPriorityQueue; 

public static class MyReducer extends Reducer<LongWritable, AnonymousPair, LongWritable, Text> { 
    @Override 
    protected void reduce(LongWritable key, Iterable<AnonymousPair> values, Context context) throws IOException, InterruptedException { 
     // ... 
     MinMaxPriorityQueue<AnonymousPair> pQueue = MinMaxPriorityQueue 
       .orderedBy(new AnonymousPair().comparator()) 
       .maximumSize(Constants.MaxKeywords) 
       .create(); 

     for(AnonymousPair val : values) { 
      pQueue.add(new AnonymousPair(val)); // No problem with copy constructor 
      // pQueue.add(val);     // Wrong! Every element in pQueue will be the same 
     } 
    } 
} 

に気づいた、pQueue内のすべての要素が同じなってしまいます。誰も私がこれを理解するのを助けることができますか?ありがとう! 私の推測は

  1. リデューザーへの参照値要素は変更される場合があります。それは文書のどこかにあるが、私はそれを逃した。
  2. 私はWritableComparable実装で誤って
  3. それとも何か間違ったGoogleのグアバMinMaxPriorityQueueを使用してい

マイAnonymousPair実装

public static class AnonymousPair implements WritableComparable<AnonymousPair> { 
     private String a = ""; 
     private Float b = 0f; 
     public AnonymousPair() {} 
     public AnonymousPair(String a, Float b) {this.a = a; this.b = b;} 
     public AnonymousPair(AnonymousPair o) {this.a = o.a; this.b = o.b;} 

     public Comparator<AnonymousPair> comparator() {return new AnonymousPairComparator();} 

     class AnonymousPairComparator implements Comparator<AnonymousPair> { 
      @Override 
      public int compare(AnonymousPair o1, AnonymousPair o2) { 
       Float diff = o1.b - o2.b; 
       if(diff == 0) { 
        return 0; 
       } 
       if(diff < 0) { 
        return 1; // Reverse order 
       } else { 
        return -1; 
       } 

      } 
     } 

     @Override 
     public int compareTo(AnonymousPair o) { 
      int temp = this.a.compareTo(o.a); 
      if(temp == 0) { 
       return -this.b.compareTo(o.b); 
      } else { 
       return temp; 
      } 
     } 

     // More overriding... 
    } 
+0

'AnonymousPair'クラスと' pQueue'が実装されている/定義されている場所を表示 –

+0

'ret'変数がどこに宣言されているのかわかりません。 – tsolakp

+0

申し訳ありません。それはちょうど 'リターン'でなければなりません。 –

答えて

1

javadocを参照してください:

フレームワークが再利用されます渡されるキーおよび値オブジェクトしたがって、アプリケーションはオブジェクトを複製する必要があります 彼らはコピーを保持したいです。多くの場合、すべての値は0または1の値に を組み合わせたものです。

+0

ありがとう!正確に私が探しているもの。しかし、再利用はどのようにフレームワークを助けますか? WritableComparableは私には軽いと思われます。 –

+0

これは、非常に大きなファイルの処理と組み合わされていますが、何千万もの行を持つことができます。 – tsolakp

関連する問題