我的hadoop代码永远不会进入关键值的测试

时间:2014-02-14 17:25:13

标签: java hadoop

我写了一个mapreduce程序,我想测试组合器的关键值。

以下是组合器的代码:

public static class FlowStats_Combiner extends Reducer<Text, Text, Text, Text> {

     public void reduce(Text key, Iterable<Text> values, Context context) throws IOException, InterruptedException {

         String test = key.toString().trim();

         if ((test=="srcPort")||(test=="dstPort")||(test=="srcAddr")||(test=="dstAddr")){

             StringBuilder builder = new StringBuilder();
             for (Text value:values){
                 builder.append(value.toString());
                 builder.append('|');
             }

               context.write(key, new Text(builder.toString()));
         }


         if ((test=="Packet")||(test=="Byte")||(test=="Flow")){
             int sum = 0;
             for (Text value : values){
                 sum += Integer.valueOf(value.toString());
             }
               context.write(key, new Text(Integer.toString(sum)));
         }                       
     }
}

该程序从未进入IF测试。你能知道出了什么问题吗? 谢谢。 温斯顿。

1 个答案:

答案 0 :(得分:3)

使用String#equals来比较Strings==运算符比较对象引用。从trim方法返回的Strings是与您要比较的字符串文字的不同对象,因此永远不会输入if语句块

if (test.equals("srcPort") || 
    test.equals("dstPort")|| 
    test.equals("srcAddr") || 
    test.equals("dstAddr")) {

要避免NPE您可以使用

if ("srcPort".equals(test) || 
    "dstPort".equals(test)|| 
    "srcAddr".equals(test) || 
    "dstAddr".equals(test)) {