hbase是我們大數(shù)據(jù)經(jīng)常使用的一個數(shù)據(jù)庫,我們經(jīng)常需要根據(jù)某些條件去hbase獲取需要的數(shù)據(jù),本文主要聊一下我在項目中用到的過濾查詢(基于scan查詢)。
行鍵過濾器RowFilter
new RowFilter(CompareOperator.EQUAL, new BinaryPrefixComparator("".getBytes()))
列族過濾器FamilyFilter
new FamilyFilter(CompareOperator.EQUAL, new BinaryPrefixComparator("".getBytes()))
列過濾器QualifierFilter
new QualifierFilter(CompareOperator.EQUAL, new BinaryPrefixComparator("".getBytes()))
值過濾器ValueFilter
new ValueFilter(CompareOperator.EQUAL, new BinaryPrefixComparator("".getBytes()))
過濾器的第一個參數(shù)是邏輯條件,hbase默認的有
public enum CompareOperator {
/** less than */
LESS,
/** less than or equal to */
LESS_OR_EQUAL,
/** equals */
EQUAL,
/** not equal */
NOT_EQUAL,
/** greater than or equal to */
GREATER_OR_EQUAL,
/** greater than */
GREATER,
/** no operation */
NO_OP,
}
第二個參數(shù)是過濾條件,常用方式有
// 前綴比較
new BinaryPrefixComparator("".getBytes())
// 全值比較
new BinaryComparator("".getBytes())
// 是否包含
new SubstringComparator("")
// 正則匹配
new RegexStringComparator("")
hbase還支持多個過濾條件組合查詢,可以通過FilterList。hbase默認支持多個過濾器之間的關系是交還是并。
val filterList = new FilterList(FilterList.Operator.MUST_PASS_ALL)
public enum Operator {
/** !AND */
MUST_PASS_ALL,
/** !OR */
MUST_PASS_ONE
}
如果過濾器之間想實現(xiàn)括號的功能(f1 && f2)|| f3類似這樣的需求,可以使用多個FilterList即可
val filterList1 = new FilterList(FilterList.Operator.MUST_PASS_ALL)
val filterList2 = new FilterList(FilterList.Operator.MUST_PASS_ONE)
filterList1.addFilter(filterList2)
時間戳過濾器TimestampsFilter
這里需要注意是時間戳過濾器的參數(shù)需要的java類型的數(shù)據(jù)結(jié)構(gòu),所有List和Long我們需要顯式的指定是java類
val arrayList = new util.ArrayList[lang.Long]()
arrayList.add(123L)
new TimestampsFilter(arrayList)
單值過濾器SingleColumnValueFilter
可以直接過濾出需要的value值
new SingleColumnValueFilter(family.getBytes(), "is_matched".getBytes(), CompareOperator.NOT_EQUAL, "1".getBytes())
以上是筆者使用過的過濾器,當然hbase還有其他的過濾器,有需要的小伙伴可以自行官網(wǎng)查詢使用。
歡迎對技術感興趣的小伙伴一起交流學習^^