hadoop 서열화 사용자 정의 유형 및 서열화 대상 비교 분석

1884 단어 hadoop
public static class Comparator extends WritableComparator {
    
    private static final Text.Comparator TEXT_COMPARATOR = new Text.Comparator();
    
    public Comparator() {
      super(TextPair.class);
    }

    @Override
    public int compare(byte[] b1, int s1, int l1,
                       byte[] b2, int s2, int l2) {
      
      try {
        int firstL1 = WritableUtils.decodeVIntSize(b1[s1]) + readVInt(b1, s1);
        int firstL2 = WritableUtils.decodeVIntSize(b2[s2]) + readVInt(b2, s2);
        int cmp = TEXT_COMPARATOR.compare(b1, s1, firstL1, b2, s2, firstL2);
        if (cmp != 0) {
          return cmp;
        }
        return TEXT_COMPARATOR.compare(b1, s1 + firstL1, l1 - firstL1,
                                       b2, s2 + firstL2, l2 - firstL2);
      } catch (IOException e) {
        throw new IllegalArgumentException(e);
      }
    }
  }

그렇다면 구체적으로 어떻게 처리했을까, 지금 예를 들면 두 대상을 비교하는 것이다
t1은 "abc"및 "ba", t2는 "abc"및 "ab"
그러면 비교할 때 b1의 수조 형식은[3,97,98,99,2,98,97]이고 동리 b2는[3,97,98,99,2,97,98]
그 중에서 수조의 구조 형식은 3이utf-8의 바이트 수를 나타내고 97-99는 구체적인 바이트 내용이며 다른 이치는 같다.
WritableUtils.decodeVIntSize(b1[s1])

이 방법은 바이트의 길이, 즉 차지 상황을 나타낸다. byte는 127을 최대 지원하기 때문에 길이가 이 값보다 크면 수조의 여러 개를 차지해서 기록해야 한다. 여기는 1이다.
readVInt(b1, s1)

이 방법의 반환값은 3이다. 즉, 첫 번째text 서열화된 바이트의 길이를 얻는다. 여기는 3.
그래서firstL1은 4로 첫 번째text 서열화 대상이byte의 길이를 차지하는 것을 나타낸다. 여기는 4이다.
그러면
 TEXT_COMPARATOR.compare(b1, s1, firstL1, b2, s2, firstL2);

방법은 97,98,99와 97,98,99의 크기를 비교하였는데, 분명히 여기는 0으로 되돌아왔다
0으로 되돌아오면 두 번째text 서열화 대상을 비교한 다음 크기를 판단합니다.

좋은 웹페이지 즐겨찾기