Hadoop文本比较不起作用

时间:2016-10-10 19:08:43

标签: java hadoop mapreduce reducers

下面是Hadoop Reducer的代码,我无法理解为什么比较(放在斜杠之间)总是失败,这里我们比较两个Text类型值。此代码适用于执行反向索引的Reducer。

 public static class IntSumReducer
       extends Reducer<TextPair, Text, Text, Text>{

    private Text indexedData = new Text();

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

        Iterator<Text>  itr = values.iterator();
        Text oldValue = itr.next() ;
        String old = oldValue.toString();

        //String next;
        int freq = 1;
        Text nextValue = null;
        StringBuilder stringBuilder = new StringBuilder();

        if(itr.hasNext()==false) {
            stringBuilder.append(old + 1);
        }

        while(itr.hasNext()) {
            nextValue = itr.next();         
            int compareValue = oldValue.compareTo(nextValue);

            while(compareValue == 0) {
                freq++;

                if(itr.hasNext()) {
                    nextValue = itr.next();

                   ////////////////////////////
                   // following comparison always returning zero
                   // Although values are changing
                   compareValue = oldValue.compareTo(nextValue);
                   ///////////////////////////

                    System.out.println(compareValue);

                } else {
                    freq++;
                    System.out.println("Break due to data loss..");
                    break;
                }               
            }//end while
            System.out.println("Value Changed..");
            old = old + freq;
            stringBuilder.append(old);
            stringBuilder.append(" | ");
            oldValue = nextValue;
            old = nextValue.toString();
            freq = 1;

        }//endwhile

        //System.out.println("KEY :: " + key.toString());   
        context.write(key.getFirst(),new Text(stringBuilder.toString()));
    }   
}

任何帮助都表示赞赏,因为我是这个领域的新手。

1 个答案:

答案 0 :(得分:2)

你的问题很可能与Iterable<Text>正在重用Text个对象的事实有关,所以每次都没有给你一个新对象,它只是重用了同一个对象。

至少你需要改变这两行:

Text oldValue = itr.next();
oldValue = nextValue;

要:

Text oldValue = new Text(itr.next());
oldValue.set(nextValue);

否则您只是比较同一个对象,因为oldValue将始终指向您正在比较它的对象。