我是 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)>
),但是 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
你能告诉我代码有什么问题或/以及为什么会这样吗?
最佳答案
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);
}
关于java - MapReduce 计数问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42265896/