hbase2.1.x Comparator比较器 作者:马育民 • 2023-01-22 20:36 • 阅读:10050 # 说明 HBase 的一些过滤器使用了 **比较器**,用于比较值,如:大于值,前缀符合某个要求 所有的比较器实现类都继承于父类 `ByteArrayComparable`,而 `ByteArrayComparable` 又实现了 `Comparable` 比较接口 不同功能的比较器差别在于:对 `Comparable` 接口中 `compareTo()` 方法的实现不同 # BinaryComparator **二进制** 比较器,用于按字典顺序比较指定字节数组,如果是字符串,比较的是 ascii 码 ### 例子 ``` BinaryComparator bc = new BinaryComparator(Bytes.toBytes("bbb")); int code1 = bc.compareTo(Bytes.toBytes("bbb")); System.out.println(code1); // 0,表示相同 int code2 = bc.compareTo(Bytes.toBytes("aaa")); System.out.println(code2); // 1,表示 当前值 bbb 的字节大于形参 aaa int code3 = bc.compareTo(Bytes.toBytes("ccc")); System.out.println(code3); // -1,表示 当前值 bbb 的字节小于形参 aaa int code4 = bc.compareTo(Bytes.toBytes("bbbaaedf")); System.out.println(code4); // -5,两个字符串不一样长,则返回两个字符串的长度差值 ``` **比较规则:** - 两个字符串首字母不同,则该方法返回首字母的asc码的差值 - 两个字符串如果 **首字符相同**,则比较下一个字符,直到有不同的为止,返回该不同的字符的asc码差值 - 两个字符串不一样长,可以参与比较的字符又完全一样,则返回两个字符串的长度差值 # BinaryPrefixComparator 二进制比较器,比较前缀是否相同,如果是字符串,比较的是 ascii 码 ### 例子 ``` BinaryPrefixComparator bc = new BinaryPrefixComparator(Bytes.toBytes("cb")); int code1 = bc.compareTo(Bytes.toBytes("cbf")); System.out.println(code1); // 0,当前值 cb 与 形参 cbf 的前缀相同 int code2 = bc.compareTo(Bytes.toBytes("aaa")); System.out.println(code2); // 2,当前值 cb 与 形参 aaa 的前缀不同 int code3 = bc.compareTo(Bytes.toBytes("ecc")); System.out.println(code3); // -2,当前值 cb 与 形参 aaa 的前缀不同 ``` # SubstringComparator 判断 `SubstringComparator` 对象中的字符串,是否出现在 字符串 `value` 中,并且不区分大小写。 返回值: - 包含字串返回0 - 不包含返回1 ### 例子 ``` String value = "HADOOP从入门到精通"; SubstringComparator sc = new SubstringComparator("P从入门"); int i = sc.compareTo(Bytes.toBytes(value)); System.out.println(i); // 0 ,字符串 "P从入门" 在 "HADOOP从入门到精通" 中 SubstringComparator sc2 = new SubstringComparator("ooP"); int i2 = sc2.compareTo(Bytes.toBytes(value)); System.out.println(i2); // 0,字符串 "ooP" 在 "HADOOP从入门到精通" 中(不区分大小写) SubstringComparator sc3 = new SubstringComparator("abd"); int i3 = sc3.compareTo(Bytes.toBytes(value)); System.out.println(i3); // 1,字符串 "abd" 不在 "HADOOP从入门到精通" 中 ``` # RegexStringComparator 支持正则表达式的值比较,匹配成功返回0,匹配失败返回1。 ### 例子 ``` String check = "^([a-z0-9A-Z]+[-|\\.]?)+[a-z0-9A-Z]@([a-z0-9A-Z]+(-[a-z0-9A-Z]+)?\\.)+[a-zA-Z]{2,}$"; RegexStringComparator rsc2 = new RegexStringComparator(check); int code = rsc2.compareTo(Bytes.toBytes("zpb@163.com")); System.out.println(code); // 0,匹配正则表达式 int code2 = rsc2.compareTo(Bytes.toBytes("zpb#163.com")); System.out.println(code2); // 1,不匹配正则表达式 ``` # NullComparatorDemo 判断当前值是不是为null。是null返回0,不是null返回1 ### 例子 ``` NullComparator nc = new NullComparator(); int i1 = nc.compareTo(Bytes.toBytes("abc")); int i2 = nc.compareTo(Bytes.toBytes("")); int i3 = nc.compareTo(null); System.out.println(i1); // 1 System.out.println(i2); // 1 System.out.println(i3); // 0 ``` # LongComparator 略 # BigDecimalComparator 略 # BitComparator 略 参考: https://developer.aliyun.com/article/800329 原文出处:http://malaoshi.top/show_1IX4pKTY0Wen.html