2016-10-10 6 views
2

Ниже приведен код для Hadoop Reducer, я не могу понять, почему сравнение (между косами) всегда терпит неудачу, здесь мы сравниваем два значения типа Text. Этот код предназначен для редуктора, делающего инвертированное индексирование.Сравнение Hadoop Text не работает

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())); 
    } 
} 

Любая помощь приветствуется, поскольку я совершенно новичок в этой области.

ответ

2

Ваша проблема, скорее всего, связана с тем, что Iterable<Text> повторно использует объекты Text, поэтому каждый раз он не дает вам новый объект, он просто повторно использует один и тот же объект.

Как минимум, вы должны изменить эти две строки:

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

To:

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

В противном случае вы просто сравнивая один и тот же объект, поскольку oldValue всегда будет указывать на вас объект» также сравнивая его.

+0

Спасибо! Это действительно сработало. Я совершенно не знал об этой проблеме. –

 Смежные вопросы

  • Нет связанных вопросов^_^