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 서열화 대상을 비교한 다음 크기를 판단합니다.