2017-02-16 150 views
1

我是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 

你能告诉我是什么代码是错误的还是/为什么它的行为如此?

+0

在哪里(以及如何)你声明'result'? – vefthym

+1

你的代码是正确的。确保您运行最新版本的可运行jar。您可能正在运行代码的以前版本。编译并再次制作该jar来确保。 – vefthym

+0

@vefthym public static class IntSumReducer extends Reducer { \t private Text result = new Text(); 这只是Reducer 的Text属性,我使用eclipse,因此每次执行我的代码时都会生成一个新的jar。 +我试图在控制台版本(我认为在eclipse中有一个错误),并使用正确的命令来创建jar和使用它,但相同的结果... – Didi

回答

-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); 
} 
+0

结果写入上下文,显然是一个文本,而不是一个集 – AdamSkywalker

+0

我已经尝试过这样的问题......为什么变量sum重置为1? – Didi