我写了一个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测试。你能知道出了什么问题吗? 谢谢。 温斯顿。
答案 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)) {