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)
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,569评论 4 363
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,499评论 1 294
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,271评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,087评论 0 209
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,474评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,670评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,911评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,636评论 0 202
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,397评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,607评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,093评论 1 261
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,418评论 2 254
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,074评论 3 237
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,092评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,865评论 0 196
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,726评论 2 276
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,627评论 2 270

推荐阅读更多精彩内容