我是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
你能告诉我代码有什么问题吗?或者/或者为什么它会这样?
1条答案
按热度按时间amrnrhlw1#
reducer的两个代码版本都有问题。你可以用v2,但要改变一下
result.set("d("+ key +")=" + sum);
出局了。使用此代码: