Java MapReduce计数问题
我是hadoop新手,我尝试制作一个程序,该程序将使用一个输入文件来描述一个带边的图形,例如:a,B,a,C,B,D,a,D我想计算每个顶点的度数并如下所示:Java MapReduce计数问题,java,hadoop,mapreduce,reduce,Java,Hadoop,Mapreduce,Reduce,我是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个顶点并发射as-ex:但是reduce有一个我无法理解的问题。当我执行cont
(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个顶点并发射as-ex:但是reduce有一个我无法理解的问题。当我执行context.writekey时,结果;在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);
}
}
减少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);
}
您能告诉我代码有什么问题吗?或者/或者为什么它会这样做?Reducer的两个代码版本都有问题。您可以使用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);
}
结果写在上下文中,显然是一个文本,而不是SetI已经尝试过的,同样的问题。。。为什么变量总和重置为1?在哪里以及如何声明结果?您的代码是正确的。确保运行最新版本的runnable jar。您可能正在运行以前版本的代码。编译并再次生成jar以确保。@vefthym公共静态类IntSumReducer扩展了Reducer{private Text result=new Text;这只是Reducer的一个文本属性,我正在使用eclipse,因此每次我执行代码时它都会生成一个新的jar。+我在控制台版本中尝试过,我认为eclipse中有一个bug,并使用了正确的命令来创建jar并使用它,但结果相同。。。
A d(A)=1
B d(B)=1
C d(C)=1
D d(D)=1
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);
}