【发布时间】:2017-07-05 02:07:57
【问题描述】:
我是 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
您能告诉我代码有什么问题或/以及为什么会这样吗?
【问题讨论】:
-
您在哪里(以及如何)声明
result? -
您的代码是正确的。确保运行最新版本的可运行 jar。您可能正在运行以前版本的代码。再次编译并制作 jar 以确保。
-
@vefthym public static class IntSumReducer extends Reducer
{ private Text result = new Text();这只是 Reducer 的 Text 属性,我正在使用 eclipse,所以每次执行代码时它都会生成一个新 jar。 + 我在控制台版本中尝试过(我认为 eclipse 中存在错误)并使用正确的命令来创建 jar 并使用它,但结果相同......
标签: java hadoop mapreduce reduce