Hbase过滤器使用

基于列过滤的过滤器

1,ColumnPaginationFilter
列分页过滤器:基于列进行分页,需要设置偏移量与返回数量。

构造函数:
ColumnPaginationFilter(final int limit, final int offset)

2,ColumnCountGetFilter
列计数过滤器:返回限定数量的列,可以指定需要返回的数量限制。

构造函数:
ColumnCountGetFilter(final int n)

这个过滤器更适合get操作,使用scan操作时需要注意,当某一行的列数量超过指定的数量,scan不会继续扫描下一行,而是停止本次扫描直接返回结果。
3,FirstKeyOnlyFilter
首列过滤器:只返回每一行的第一列。
4,FirstKeyValueMatchingQualifiersFilter
首次匹配列过滤器:通过设置一组需要匹配的列,只要匹配到任意一个列就会停止这一行的扫描操作进行下一行的扫描。

Set<byte[]> qualifiers = new HashSet<byte[]>();
qualifiers.add(column_a);
qualifiers.add(column_b);
Filter filter = new FirstKeyValueMatchingQualifiersFilter(qualifiers);

上诉代码设定两个需要匹配的列column_a,column_b,只要匹配到任意一个列就会停止这一行的扫描,继续扫描下一行(针对scan)。假设存储结构上column_b位于column_a之后。扫描过程中会首先匹配到column_a,此时不会继续匹配下一个列,而是直接开始下一行的扫描。返回结果包括匹配到的列之前的所有列值(包含匹配列)。
5,ColumnPrefixFilter
列前缀过滤器:通常所说的前缀匹配。

构造函数:
ColumnPrefixFilter(final byte [] prefix)

6,MultipleColumnPrefixFilter
列多前缀匹配过滤器:在列前缀匹配的基础上增加匹配列。

byte[][] prefixes = new byte[size][];
Filter prefixFilter = new MultipleColumnPrefixFilter(prefixes);

通过二维字节数组设定多个需要匹配的列前缀进行匹配。
7,ColumnRangFilter
列范围匹配过滤器:设定列的范围进行匹配

构造函数:
ColumnRangeFilter(byte[] minColumn, boolean minColumnInclusive, byte[] maxColumn, boolean maxColumnInclusive)
参数解释:
minColumn - 列范围的最小值,如果为空,则没有下限;
minColumnInclusive - 列范围是否包含minColumn ;
maxColumn - 列范围最大值,如果为空,则没有上限;
maxColumnInclusive - 列范围是否包含maxColumn 。

基于行的过滤器

1,PrefixFilter
行前缀过滤器:行的前缀匹配

构造函数:
PrefixFilter(final byte [] prefix)

2,PageFilter
行键分页过滤器:基于行的分页

构造函数:
PageFilter(final long pageSize)

需要注意的是返回的行数并不以一定是指定的行数,由于Hbase的存储特性,scan在并行扫描不同Region服务器时并不能做到共享他们各自已经筛选的行数,因此在返回的行数极有可能超过设定的值。
3,InclusiveStopFilter
包含结束行键的过滤器

构造函数:
InclusiveStopFilter(final byte [] stopRowKey)

scan操作时不包含截至行的,使用这个过滤器可以将最后一行包含在结果之内。
4,RandomRowFilter
随机行过滤器:根据设定的概率随机选择返回的行。

构造函数:
RandomRowFilter(float chance)

设定一个概率chance,过滤器内部调用java的随机方法产生一个随机数,如果产生的随机数小于设定的概率则包含改行,否则过滤。

过滤逻辑源码: 
if (chance < 0) {
      // with a zero chance, the rows is always excluded
      filterOutRow = true;
    } else if (chance > 1) {
      // always included
      filterOutRow = false;
    } else {
      // roll the dice
      filterOutRow = !(random.nextFloat() < chance);
    }

可见如果设定概率小于0,则全部过滤,如果设置概率大于1,则全部包含。

基于单元值的过滤器

1,KeyOnlyFilter
单元值过滤器:返回的数据不包括实际的单元值,只包含行键与列。

构造函数:
new KeyOnlyFilter()

当所需要的数据在列中就可以提取时可以选择使用这个过滤器来减少服务器端到客户端的网络数据传输。
2,TimestampsFilter
单元值时间版本过滤器:根据数据的时间戳版本进行过滤。

构造函数:
TimestampsFilter(List<Long> timestamps)

每一个列在特定的时间写入数据都会默认赋予数据一个时间戳版本,可以通过指定不同的时间戳版本来获取不同时间段的数据。

基于列、单元值的过滤器

1,SingleColumnValueFilter
单列值过滤器:指定需要进行过滤的列,对该列的单元值进行比较过滤。

构造函数:
SingleColumnValueFilter(final byte [] family, final byte [] qualifier,
      final CompareOp compareOp, final byte[] value)

需要注意的是针对指定的列的单元值进行比较过滤,如果当前行指定的列的单元值不符合过滤条件,则当前行整个过滤掉,反之则会返回当前行的全部数据,包括没有指定需要过滤的列。

SingleColumnValueFilter filter = new SingleColumnValueFilter(
                    famliy, column_a, CompareOp.EQUAL, Bytes.toBytes("value_a"));

假设某一行包含column_a与column_b两列,每一列的单元值分别为value_a,value_b。上述代码指定过滤列为column_a,单元值的过滤条件为等于value_a,column_a的单元值value_a与设定的单元值过滤条件相符,因此这一行数据会被返回,包括未指定参与过滤的column_b。如果column_a的单元值被更改为value_new,过滤过程中发现与设定的单元值过滤条件不符,这一行数据将会被全部过滤掉。
2,SingleColumnValueExcludeFilter
单列值不包含过滤器:与单列值过滤器类似,只是无论是否符合过滤条件,返回的结果都不会包含指定的列。

构造函数:
SingleColumnValueExcludeFilter(byte[] family, byte[] qualifier,
      CompareOp compareOp, byte[] value)

与单列值过滤器的唯一区别就是返回结果不包含指定列的数据。

比较过滤器

比较过滤器通常需要一个比较运算符以及一个比较器来实现过滤。
比较运算符通过一个枚举类设定:

public enum CompareOp {

 /** 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,

 }

比较器有如下几类:

//匹配完整的字节数组
BinaryComparator(byte[] value)
//匹配字节数组前缀
BinaryPrefixComparator(byte[] value)
//正则表达式匹配
RegexStringComparator(String expr)
//子串匹配(存储类型为字符时使用)注意:只能使用等于与不等于比较运算符
SubstringComparator(String substr)
//Long型数值
LongComparator(long value)

1,RowFilter
行键过滤器:对行键进行过滤

构造函数:
RowFilter(final CompareOp rowCompareOp, final ByteArrayComparable rowComparator)
RowFilter filter = new RowFilter(CompareOp.EQUAL, new BinaryComparator(row));

2,FamilyFilter
列族过滤器

FamilyFilter(final CompareOp familyCompareOp, final ByteArrayComparable familyComparator)

一般直接使用addFamily(family)添加需要过滤的列族条件,该过滤器使用频率不高。
3,QualifierFilter
列过滤器

QualifierFilter(final CompareOp op, final ByteArrayComparable qualifierComparator)

对列名进行筛选,类似于行键过滤器,只是针对列名过滤而已。
4,ValueFilter
单元值过滤器:对单元值进行过滤

ValueFilter(final CompareOp valueCompareOp, final ByteArrayComparable valueComparator)
    原文作者:Coffeelong
    原文地址: https://www.jianshu.com/p/18ef91fbb090
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞