MapReduce计数问题

时间:2017-02-16 05:43:47

标签: java hadoop mapreduce reduce

我是hadoop的新手,我尝试制作一个程序,它将采用描述带边缘图形的输入文件(例如:(A,B), (A,C), (B,D), (A,D))我想计算每个顶点的度数并将其显示为这个:

 (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

目前我能够使我的地图运行良好(拆分2个顶点并将<Key, Value>作为<Vertex, Edge>发出(例如<A, (A,B)>)但是reduce有一个问题我无法理解。当我在for循环之外执行context.write(key, result);时,显示的结果始终为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

你能告诉我代码有什么问题或/和它为什么会这样?

1 个答案:

答案 0 :(得分:-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);
}