mapreduce计数问题

dhxwm5r4  于 2021-06-02  发布在  Hadoop
关注(0)|答案(1)|浏览(305)

我是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

目前,我能够使我的Map工作得很好(分裂的2个顶点和发射的图像) <Key, Value> 作为 <Vertex, Edge> (例如: <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

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

amrnrhlw

amrnrhlw1#

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);
}

相关问题