1. 程式人生 > >HBase Filter 過濾器之 Comparator 原理及原始碼學習

HBase Filter 過濾器之 Comparator 原理及原始碼學習

> **前言:**上篇文章[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.