Hadoop의 Comparator 원리

8501 단어 comparator
앞의 블로그인 Hadoop의 Writable Comparable 및 comparator에서 Writable Comparator가 말한 것이 세밀하지 못하므로 구체적인 실현 원리를 말씀드리겠습니다!
1. Writable Comparator는 주로 두 가지 기능을 제공합니다.
  • 는 원시적인compara() 방법에 대한 기본적인 실현을 제공했다. 기본적인 실현은 먼저 반서열화되어 대상으로 비교하는 것이다
  •  1 public int compare(byte[] b1, int s1, int l1, byte[] b2, int s2, int l2) {
    
     2 
    
     3     try {
    
     4 
    
     5       buffer.reset(b1, s1, l1);                   // parse key1
    
     6 
    
     7       key1.readFields(buffer);
    
     8 
    
     9      
    
    10 
    
    11       buffer.reset(b2, s2, l2);                   // parse key2
    
    12 
    
    13       key2.readFields(buffer);
    
    14 
    
    15      
    
    16 
    
    17     } catch (IOException e) {
    
    18 
    
    19       throw new RuntimeException(e);
    
    20 
    
    21     }
    
    22 
    
    23    
    
    24 
    
    25     return compare(key1, key2);                   // compare them
    
    26 
    
    27 }

     
    대응하는 기초 데이터 유형의compare()의 실현은 특정 유형의 범위화를 교묘하게 이용했다. (writable Comparable의compareTo 방법을 이용했다)
    1 public int compare(WritableComparable a, WritableComparable b) {
    
    2 
    
    3     return a.compareTo(b);
    
    4 
    
    5   }
  • RawComparator의 등록 공장을 충당하고 get() 방법을 통해 실례를 얻는다.

  • Writable Comparator에서private static HashMapWritableComparator>comparators=new HashMap().RawComparator 실례가 기록되어 있습니다. 예를 들어 아래 코드를 통해 IntWritable 유형의 RawComparator를 얻을 수 있습니다.
    RawComparator<IntWritable> writable = WritableComparator.get(IntWritable.class);

     
    2. Writable Comparator에서 사용자 정의 Writable을 등록하는 방법
    Writable Comparator 클래스에 define 방법이 있습니다. 이 방법을 통해 Writable를 Writable Comparator에 등록하여 get 방법을 통해 실례를 직접 얻을 수 있습니다!
    1 public static synchronized void define(Class c,WritableComparator comparator) {
    
    2         comparators.put(c, comparator);
    
    3 }

     
    3. BooleanWritable에 내장된 Comparator의 실현
    Writable Comparable의 여러 가지 실례, 예를 들어 IntWritable 실례: 내부 클래스인 Comparator 클래스는 자신의 IntWritable 유형에 따라 Writable Comparator 안의 compare () 방법을 다시 불러와야 한다. Writable Comparator 안의 compare () 방법은 부족한 실현을 제공할 뿐이고 진정한 compare () 방법은 자신의 유형인 IntWritable에 따라 다시 불러와야 한다.그래서 Writable Comparator 방법의 readInt.등 방법은 밑바닥의 봉인을 실현하는 것일 뿐 내부 Comparator에서 호출하기 편리할 뿐이다.
    BooleanWritable 클래스에 내장된 RawCompartor의 구현 과정을 살펴보겠습니다.
     1 **
    
     2        * A Comparator optimized for BooleanWritable.
    
     3         */
    
     4        public static class Comparator extends WritableComparator {
    
     5          public Comparator() {// Constructor keyClass=BooleanWrite.class
    
     6            super(BooleanWritable.class);
    
     7          }
    
     8          //
    
     9          public int compare(byte[] b1, int s1, int l1,
    
    10                             byte[] b2, int s2, int l2) {
    
    11            boolean a = (readInt(b1, s1) == 1) ? true : false;
    
    12            boolean b = (readInt(b2, s2) == 1) ? true : false;
    
    13            return ((a == b) ? 0 : (a == false) ? -1 : 1);
    
    14          }
    
    15        }
    
    16        // 
    
    17        static {
    
    18          WritableComparator.define(BooleanWritable.class, new Comparator());
    
    19        }

     
     
     

    좋은 웹페이지 즐겨찾기