我是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
你能告诉我代码有什么问题或/和它为什么会这样?
答案 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);
}