hadoop文本比较不起作用

ogq8wdun  于 2021-06-02  发布在  Hadoop
关注(0)|答案(1)|浏览(362)

下面是一个hadoop 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()));
    }   
}

任何帮助都是感激的,因为我对这个领域完全陌生。

wfauudbj

wfauudbj1#

你的问题很可能与 Iterable<Text> 重复使用 Text 对象,所以它不会每次都给你一个新对象,它只是重用同一个对象。
至少您需要更改这两行:

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

收件人:

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

否则你只是比较同一个物体,因为 oldValue 总是指向你正在比较的对象。

相关问题