hbase是我们大数据经常使用的一个数据库,我们经常需要根据某些条件去hbase获取需要的数据,本文主要聊一下我在项目中用到的过滤查询(基于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()))
过滤器的第一个参数是逻辑条件,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,
}
第二个参数是过滤条件,常用方式有
// 前缀比较
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
}
如果过滤器之间想实现括号的功能(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
这里需要注意是时间戳过滤器的参数需要的java类型的数据结构,所有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还有其他的过滤器,有需要的小伙伴可以自行官网查询使用。
欢迎对技术感兴趣的小伙伴一起交流学习^^