2016-10-10 7 views
2

아래는 하둡 감속기의 코드입니다. 왜 비교가 (슬래시 사이에 배치되었는지) 항상 실패했는지 이해할 수 없습니다. 여기서 두 개의 텍스트 유형 값을 비교하고 있습니다. 이 코드는 역 인덱싱을 수행하는 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())); 
    } 
} 

나는이 분야를 완전히 새로운 것으로 생각합니다.

답변

2

Iterable<Text> 개체가 Text 개체를 다시 사용한다는 사실과 관련된 문제 일 가능성이 큽니다. 따라서 매번 새로운 개체를 제공하기 때문에 동일한 개체를 다시 사용합니다.

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

하려면 : oldValue 항상 객체 당신 '에서 지적 때문에

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

그렇지 않으면 당신은 단지 동일한 개체를 비교하고이 두 라인을 변경해야 할 최소한

그것도 다시 비교합니다.

+0

감사! 정말 효과가있었습니다. 나는이 문제를 완전히 알지 못했다. –