私はhadoopが新しく、エッジを持つグラフを記述する入力ファイル(例:(A,B), (A,C), (B,D), (A,D)
)を取るプログラムを作ろうとします。各頂点の度数を数えたいと思います。 :MapReduceのカウント問題
<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
はあなたが私に言うことができるものコードに間違っていますか、なぜこのように振る舞いますか?
(とどのように)あなたが 'result'を宣言するのですか? – vefthym
あなたのコードは正しいです。実行可能なjarの最新バージョンを実行していることを確認してください。以前のバージョンのコードを実行している場合があります。コンパイルして、瓶をもう一度作り直してください。 – vefthym
@vefthym public static class IntSumReducer リデューサを拡張します。 { \tプライベートテキストresult = new Text(); これはReducer のテキスト属性です。私はコードを実行するたびに新しいjarを生成するようにeclipseを使用しています。 +私はコンソール版で試しました(私は日食にバグがあると思っていました)、正しいコマンドを使ってjarファイルを作成し、それを使用しましたが、同じ結果を返しました... –
Didi