说明
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
略