HBase Filter 过滤器之 Comparator 原理及源码学习
周蓬勃 人气:1
> **前言:**上篇文章[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.Comparer
加载全部内容