我是hadoop的新手,我尝试制作一个程序,它将采用描述带边缘的图形的输入文件(例如:(A,B), (A,C), (B,D), (A,D)
)我想计算每个顶点的度数并将其显示为像这样当<A, (A,B)>
),但减少有我不明白一个问题:MapReduce计算问题
(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>
(前。我在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'? – vefthym
你的代码是正确的。确保您运行最新版本的可运行jar。您可能正在运行代码的以前版本。编译并再次制作该jar来确保。 – vefthym
@vefthym public static class IntSumReducer extends Reducer { \t private Text result = new Text(); 这只是Reducer 的Text属性,我使用eclipse,因此每次执行我的代码时都会生成一个新的jar。 +我试图在控制台版本(我认为在eclipse中有一个错误),并使用正确的命令来创建jar和使用它,但相同的结果... –
Didi