HBase Filter 過濾器之 Comparator 原理及原始碼學習
阿新 • • 發佈:2020-04-26
> **前言:**上篇文章[HBase Filter 過濾器概述](https://mp.weixin.qq.com/s/76y5NIBQMwvR11Cx2Mbt3w)對HBase過濾器的組成及其家譜進行簡單介紹,本篇文章主要對HBase過濾器之比較器作一個補充介紹,也算是HBase Filter學習的必備低階魂技吧。本篇文中原始碼基於HBase 1.1.2.2.6.5.0-292 HDP版本。
HBase所有的比較器實現類都繼承於父類ByteArrayComparable,而ByteArrayComparable又實現了Comparable介面;不同功能的比較器差別在於對父類compareTo()方法的重寫邏輯不同。
下面分別對HBase Filter預設實現的七大比較器一一進行介紹。
## 1. BinaryComparator
**介紹:**二進位制比較器,用於按字典順序比較指定位元組陣列。
先看一個小例子:
```
public class BinaryComparatorDemo {
public static void main(String[] args) {
BinaryComparator bc = new BinaryComparator(Bytes.toBytes("bbb"));
int code1 = bc.compareTo(Bytes.toBytes("bbb"), 0, 3);
System.out.println(code1); // 0
int code2 = bc.compareTo(Bytes.toBytes("aaa"), 0, 3);
System.out.println(code2); // 1
int code3 = bc.compareTo(Bytes.toBytes("ccc"), 0, 3);
System.out.println(code3); // -1
int code4 = bc.compareTo(Bytes.toBytes("bbf"), 0, 3);
System.out.println(code4); // -4
int code5 = bc.compareTo(Bytes.toBytes("bbbedf"), 0, 6);
System.out.println(code5); // -3
}
}
```
不難看出,該比較器的比較規則如下:
- 兩個字串首字母不同,則該方法返回首字母的asc碼的差值
- 參與比較的兩個字串如果首字元相同,則比較下一個字元,直到有不同的為止,返回該不同的字元的asc碼差值
- 兩個字串不一樣長,可以參與比較的字元又完全一樣,則返回兩個字串的長度差值
看一下以上規則對應其compareTo()方法的原始碼實現:
實現一:
```
static enum UnsafeComparer implements Bytes.