2017-02-16 4 views
1

私はhadoopが新しく、エッジを持つグラフを記述する入力ファイル(例:(A,B), (A,C), (B,D), (A,D))を取るプログラムを作ろうとします。各頂点の度数を数えたいと思います。 :MapReduceのカウント問題

私は2頂点を分割(よく私のマップを動作させると <Key, Value> <Vertex, Edge>など(例発することができた瞬間のために
(A,B) d(A)=3 
(A,C) d(A)=3 
(A,D) d(A)=3 
(A,B) d(B)=2 
(B,D) d(B)=2 
(A,C) d(C)=1 
(A,D) d(D)=2 
(B,D) d(D)=2 

<A, (A,B)>を)が、削減は、私が理解できない問題がある場合。私はcontext.write(key, result);をforループの外側に置いて、表示される結果は常に1です。デバッグしようとしましたが、変数sumは正しい値を持っていました。

は削減:

public void reduce(Text key, Iterable<Text> values, 
        Context context 
       ) throws IOException, InterruptedException { 
    int sum = 0; 
    for (Text val : values) { 
     sum+=1; 
     result.set("d("+ key +")=" + sum); 
     // WRITE INSIDE THE LOOP 
     context.write(key, result); 
    } 
} 

結果:

A d(A)=1 
A d(A)=2 
A d(A)=3 
B d(B)=1 
B d(B)=2 
C d(C)=1 
D d(D)=1 
D d(D)=2 

削減V2:

public void reduce(Text key, Iterable<Text> values, 
        Context context 
       ) throws IOException, InterruptedException { 
    int sum = 0; 
    for (Text val : values) { 
     sum+=1; 
     result.set("d("+ key +")=" + sum); 
    } 
    // WRITE HERE NOW 
    context.write(key, result); 
} 

結果V2:

A d(A)=1 
B d(B)=1 
C d(C)=1 
D d(D)=1 

はあなたが私に言うことができるものコードに間違っていますか、なぜこのように振る舞いますか?

+0

(とどのように)あなたが 'result'を宣言するのですか? – vefthym

+1

あなたのコードは正しいです。実行可能なjarの最新バージョンを実行していることを確認してください。以前のバージョンのコードを実行している場合があります。コンパイルして、瓶をもう一度作り直してください。 – vefthym

+0

@vefthym public static class IntSumReducer リデューサを拡張します。 { \tプライベートテキストresult = new Text(); これはReducer のテキスト属性です。私はコードを実行するたびに新しいjarを生成するようにeclipseを使用しています。 +私はコンソール版で試しました(私は日食にバグがあると思っていました)、正しいコマンドを使ってjarファイルを作成し、それを使用しましたが、同じ結果を返しました... – Didi

答えて

-1

Reducerの両方のコードバージョンに問題があります。あなたはv2と一緒に行くことができますが、変更はこのresult.set("d("+ key +")=" + sum);をループから引き出します。

使用このコード:

public void reduce(Text key, Iterable<Text> values, 
        Context context 
       ) throws IOException, InterruptedException { 
    int sum = 0; 
    for (Text val : values) { 
     sum+=1; 
    } 
    result.set("d("+ key +")=" + sum); 
    // WRITE HERE NOW 
    context.write(key, result); 
} 
+0

結果は文脈に書かれています。 – AdamSkywalker

+0

私はすでにそれと同じ問題を試みました...なぜ変数の合計は1にリセットされますか? – Didi

関連する問題