HBase为筛选数据提供了一组过滤器,通过这个过滤器可以在HBase中的数据的多个维度(行,列,数据版本)上进行对数据的筛选操作,也就是说过滤器最终能够筛选的数据能够细化到具体的一个存储单元格上(由行键,列明,时间戳定位)。通常来说,通过行键,值来筛选数据的应用场景较多。

1. RowFilter:筛选出匹配的所有的行,对于这个过滤器的应用场景,是非常直观的:使用BinaryComparator可以筛选出具有某个行键的行,或者通过改变比较运算符(下面的例子中是CompareFilter.CompareOp.EQUAL)来筛选出符合某一条件的多条数据,以下就是筛选出行键为row1的一行数据:

Filter rf = new RowFilter(CompareFilter.CompareOp.EQUAL, new BinaryComparator(Bytes.toBytes("row1"))); // OK 筛选出匹配的所有的行

2. PrefixFilter:筛选出具有特定前缀的行键的数据。这个过滤器所实现的功能其实也可以由RowFilter结合RegexComparator来实现,不过这里提供了一种简便的使用方法,以下过滤器就是筛选出行键以row为前缀的所有的行:

Filter pf = new PrefixFilter(Bytes.toBytes("row")); // OK  筛选匹配行键的前缀成功的行

3. KeyOnlyFilter:这个过滤器唯一的功能就是只返回每行的行键,值全部为空,这对于只关注于行键的应用场景来说非常合适,这样忽略掉其值就可以减少传递到客户端的数据量,能起到一定的优化作用:

Filter kof = new KeyOnlyFilter(); // OK 返回所有的行,但值全是空

4. RandomRowFilter:从名字上就可以看出其大概的用法,本过滤器的作用就是按照一定的几率(<=0会过滤掉所有的行,>=1会包含所有的行)来返回随机的结果集,对于同样的数据集,多次使用同一个RandomRowFilter会返回不通的结果集,对于需要随机抽取一部分数据的应用场景,可以使用此过滤器:

Filter rrf = new RandomRowFilter((float) 0.8); // OK 随机选出一部分的行

5. InclusiveStopFilter:扫描的时候,我们可以设置一个开始行键和一个终止行键,默认情况下,这个行键的返回是前闭后开区间,即包含起始行,但不包含终止行,如果我们想要同时包含起始行和终止行,那么我们可以使用此过滤器:

Filter isf = new InclusiveStopFilter(Bytes.toBytes("row1")); // OK 包含了扫描的上限在结果之内

6. FirstKeyOnlyFilter:如果你只想返回的结果集中只包含第一列的数据,那么这个过滤器能够满足你的要求。它在找到每行的第一列之后会停止扫描,从而使扫描的性能也得到了一定的提升:

Filter fkof = new FirstKeyOnlyFilter(); // OK 筛选出第一个每个第一个单元格

7. ColumnPrefixFilter:顾名思义,它是按照列名的前缀来筛选单元格的,如果我们想要对返回的列的前缀加以限制的话,可以使用这个过滤器:

Filter cpf = new ColumnPrefixFilter(Bytes.toBytes("qual1")); // OK 筛选出前缀匹配的列

8. ValueFilter:按照具体的值来筛选单元格的过滤器,这会把一行中值不能满足的单元格过滤掉,如下面的构造器,对于每一行的一个列,如果其对应的值不包含ROW2_QUAL1,那么这个列就不会返回给客户端:

Filter vf = new ValueFilter(CompareFilter.CompareOp.EQUAL, new SubstringComparator("ROW2_QUAL1")); // OK 筛选某个(值的条件满足的)特定的单元格

9. ColumnCountGetFilter:这个过滤器来返回每行最多返回多少列,并在遇到一行的列数超过我们所设置的限制值的时候,结束扫描操作:

Filter ccf = new ColumnCountGetFilter(2); // OK 如果突然发现一行中的列数超过设定的最大值时,整个扫描操作会停止

10. SingleColumnValueFilter:用一列的值决定这一行的数据是否被过滤。在它的具体对象上,可以调用setFilterIfMissing(true)或者setFilterIfMissing(false),默认的值是false,其作用是,对于咱们要使用作为条件的列,如果这一列本身就不存在,那么如果为true,这样的行将会被过滤掉,如果为false,这样的行会包含在结果集中。

     SingleColumnValueFilter scvf = new SingleColumnValueFilter(Bytes.toBytes("colfam1"), Bytes.toBytes("qual2"), CompareFilter.CompareOp.NOT_EQUAL, new SubstringComparator("BOGUS"));scvf.setFilterIfMissing(false);scvf.setLatestVersionOnly(true); // OK

11. SingleColumnValueExcludeFilter:这个与10种的过滤器唯一的区别就是,作为筛选条件的列的不会包含在返回的结果中。

12. SkipFilter:这是一种附加过滤器,其与ValueFilter结合使用,如果发现一行中的某一列不符合条件,那么整行就会被过滤掉:

Filter skf = new SkipFilter(vf); // OK 发现某一行中的一列需要过滤时,整个行就会被过滤掉

13. WhileMatchFilter:这个过滤器的应用场景也很简单,如果你想要在遇到某种条件数据之前的数据时,就可以使用这个过滤器;当遇到不符合设定条件的数据的时候,整个扫描也就结束了:

Filter wmf = new WhileMatchFilter(rf); // OK 类似于Python itertools中的takewhile

14. FilterList:用于综合使用多个过滤器。其有两种关系:FilterList.Operator.MUST_PASS_ONE和FilterList.Operator.MUST_PASS_ALL,默认的是FilterList.Operator.MUST_PASS_ALL,顾名思义,它们分别是AND和OR的关系,并且 FilterList可以嵌套使用FilterList,使我们能够表达更多的需求:

     List<Filter> filters = new ArrayList<Filter>();filters.add(rf);filters.add(vf);FilterList fl = new FilterList(FilterList.Operator.MUST_PASS_ALL, filters); // OK 综合使用多个过滤器, AND 和 OR 两种关系

以上,是对于HBase内置的过滤器的部分总结,以下代码是数据写入代码:

package com.reyun.hbase;import java.io.IOException;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.HBaseConfiguration;
import org.apache.hadoop.hbase.client.HTable;
import org.apache.hadoop.hbase.client.Put;
import org.apache.hadoop.hbase.util.Bytes;public class HBaseDataFeeding {private final static byte[] ROW1 = Bytes.toBytes("row1");private final static byte[] ROW2 = Bytes.toBytes("row2");private final static byte[] COLFAM1 = Bytes.toBytes("colfam1");private final static byte[] COLFAM2 = Bytes.toBytes("colfam2");private final static byte[] QUAL1 = Bytes.toBytes("qual1");private final static byte[] QUAL2 = Bytes.toBytes("qual2");public static void main(String[] args) throws IOException {Configuration conf = HBaseConfiguration.create();HTable table = new HTable(conf, "testtable");table.setAutoFlushTo(false);Put put_row1 = new Put(ROW1);put_row1.add(COLFAM1, QUAL1, Bytes.toBytes("ROW1_QUAL1_VAL"));put_row1.add(COLFAM1, QUAL2, Bytes.toBytes("ROW1_QUAL2_VAL"));Put put_row2 = new Put(ROW2);put_row2.add(COLFAM1, QUAL1, Bytes.toBytes("ROW2_QUAL1_VAL"));put_row2.add(COLFAM1, QUAL2, Bytes.toBytes("ROW2_QUAL2_VAL"));try{table.put(put_row1);table.put(put_row2);}finally{table.close();}}}

以下是过滤器测试代码,可以通过修改代码,更换过滤器来看到具体的效果:

package com.reyun.hbase;import java.io.IOException;
import java.util.ArrayList;
import java.util.List;import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.Cell;
import org.apache.hadoop.hbase.CellUtil;
import org.apache.hadoop.hbase.HBaseConfiguration;
import org.apache.hadoop.hbase.client.HTable;
import org.apache.hadoop.hbase.client.Result;
import org.apache.hadoop.hbase.client.ResultScanner;
import org.apache.hadoop.hbase.client.Scan;
import org.apache.hadoop.hbase.filter.BinaryComparator;
import org.apache.hadoop.hbase.filter.ColumnCountGetFilter;
import org.apache.hadoop.hbase.filter.ColumnPrefixFilter;
import org.apache.hadoop.hbase.filter.CompareFilter;
import org.apache.hadoop.hbase.filter.Filter;
import org.apache.hadoop.hbase.filter.FilterList;
import org.apache.hadoop.hbase.filter.FirstKeyOnlyFilter;
import org.apache.hadoop.hbase.filter.InclusiveStopFilter;
import org.apache.hadoop.hbase.filter.KeyOnlyFilter;
import org.apache.hadoop.hbase.filter.PageFilter;
import org.apache.hadoop.hbase.filter.PrefixFilter;
import org.apache.hadoop.hbase.filter.RandomRowFilter;
import org.apache.hadoop.hbase.filter.RowFilter;
import org.apache.hadoop.hbase.filter.SkipFilter;
import org.apache.hadoop.hbase.filter.ValueFilter;
import org.apache.hadoop.hbase.filter.SingleColumnValueFilter;
import org.apache.hadoop.hbase.filter.SubstringComparator;
import org.apache.hadoop.hbase.filter.WhileMatchFilter;
import org.apache.hadoop.hbase.util.Bytes;public class HBaseScannerTest {public static void main(String[] args) throws IOException, IllegalAccessException {Configuration conf = HBaseConfiguration.create();HTable table = new HTable(conf, "testtable");table.setAutoFlushTo(false);Scan scan1 = new Scan();SingleColumnValueFilter scvf = new SingleColumnValueFilter(Bytes.toBytes("colfam1"), Bytes.toBytes("qual2"), CompareFilter.CompareOp.NOT_EQUAL, new SubstringComparator("BOGUS"));scvf.setFilterIfMissing(false);scvf.setLatestVersionOnly(true); // OKFilter ccf = new ColumnCountGetFilter(2); // OK 如果突然发现一行中的列数超过设定的最大值时,整个扫描操作会停止Filter vf = new ValueFilter(CompareFilter.CompareOp.EQUAL, new SubstringComparator("ROW2_QUAL1")); // OK 筛选某个(值的条件满足的)特定的单元格Filter cpf = new ColumnPrefixFilter(Bytes.toBytes("qual2")); // OK 筛选出前缀匹配的列Filter fkof = new FirstKeyOnlyFilter(); // OK 筛选出第一个每个第一个单元格Filter isf = new InclusiveStopFilter(Bytes.toBytes("row1")); // OK 包含了扫描的上限在结果之内Filter rrf = new RandomRowFilter((float) 0.8); // OK 随机选出一部分的行Filter kof = new KeyOnlyFilter(); // OK 返回所有的行,但值全是空Filter pf = new PrefixFilter(Bytes.toBytes("row")); // OK  筛选匹配行键的前缀成功的行Filter rf = new RowFilter(CompareFilter.CompareOp.NOT_EQUAL, new BinaryComparator(Bytes.toBytes("row1"))); // OK 筛选出匹配的所有的行Filter wmf = new WhileMatchFilter(rf); // OK 类似于Python itertools中的takewhileFilter skf = new SkipFilter(vf); // OK 发现某一行中的一列需要过滤时,整个行就会被过滤掉List&lt;Filter&gt; filters = new ArrayList&lt;Filter&gt;();filters.add(rf);filters.add(vf);FilterList fl = new FilterList(FilterList.Operator.MUST_PASS_ALL, filters); // OK 综合使用多个过滤器, AND 和 OR 两种关系scan1.setStartRow(Bytes.toBytes("row1")).setStopRow(Bytes.toBytes("row3")).setFilter(scvf); ResultScanner scanner1 = table.getScanner(scan1);for(Result res : scanner1){for(Cell cell : res.rawCells()){System.out.println("KV: " + cell + ", Value: " + Bytes.toString(CellUtil.cloneValue(cell)));}System.out.println("------------------------------------------------------------");}scanner1.close();table.close();}
}

Hbase系列---内置过滤器相关推荐

  1. Spring Security的内置过滤器是如何维护的?

    Spring Security中的内置过滤器顺序是怎么维护的?我想很多开发者都对这个问题感兴趣.本篇我和大家一起探讨下这个问题. HttpSecurity包含了一个成员变量FilterOrderReg ...

  2. angularJS 组件及内置过滤器

    组件化<component> 组件化是将页面中一部分UI封装起来进行重复使用,UI中的数据可以是不同的,甚至组件中可以对UI进行适当的业务逻辑处理,如链接跳转.数据运算等等 组件语法结构如 ...

  3. apache shiro内置过滤器 标签 注解

    内置过滤器 anon(匿名)  org.apache.shiro.web.filter.authc.AnonymousFilter authc(身份验证)       org.apache.shiro ...

  4. Django中的内置过滤器

    Django的内置过滤器

  5. Shiro的内置过滤器没有生效

    Shiro的内置过滤器没有生效 在学习shiro时,对某些访问路径设置过滤器,如filterMap.put("/user/add","authc");但是设置好 ...

  6. angularjs读书笔记:angularjs内置过滤器总结——摘自《Angularjs权威教程》

    过滤器用来格式化需要展示给用户的数据.AngularJS有很多实用的内置过滤器,同时也提 供了方便的途径可以自己创建过滤器. 在HTML中的模板绑定符号{{ }}内通过|符号来调用过滤器.例如,假设我 ...

  7. Hbase 内置过滤器

    HBase为筛选数据提供了一组过滤器,通过这个过滤器可以在HBase中的数据的多个维度(行,列,数据版本)上进行对数据的筛选操作,也就是说过滤器最终能够筛选的数据能够细化到具体的一个存储单元格上(由行 ...

  8. HBase内置过滤器的一些总结

    HBase为筛选数据提供了一组过滤器,通过这个过滤器可以在HBase中的数据的多个维度(行,列,数据版本)上进行对数据的筛选操作,也就是说过滤器最终能够筛选的数据能够细化到具体的一个存储单元格上(由行 ...

  9. item系列内置方法重构类

    item系列 和对象使用[]访问值有联系 obj = {'k':'v'} print(obj) # 字典的对象 print(obj['k']) 在有些内置的模块中,有一些特殊的方法,要求对象必须实现_ ...

最新文章

  1. 深入浅出 Java Concurrency (33): 线程池 part 6 线程池的实现及原理 (1)[转]
  2. 财富第三极人类社会运行模型(附路线图)
  3. Ubuntu 16.04下Caffe-SSD的应用(七)——制作自己的VOC2007数据集
  4. (二期)IOS调试技巧
  5. 大盘点|卷积神经网络必读的 100 篇经典论文,包含检测 / 识别 / 分类 / 分割多个领域
  6. node源码详解(四) —— js代码如何调用C++的函数
  7. IOS 单行文本输入框 UITextField 使用
  8. 分布式选举协议:Bully
  9. excel提取文字拼音首字母
  10. ps怎么为指定区域填充指定背景色图案?
  11. layui 树形表格 treeTable使用详细指南,不能折叠解决办法
  12. Windows server 2008 安装Hyper-V
  13. access通过身份证号提取性别_Access计算根据身份证号码字段计算年龄和性别的表达式,最好是还能确定户籍地址,该在什么地方输入?...
  14. 极路由php插件,极路由SDK
  15. python库有哪些餐厅_Python告诉你上海有哪些高性价比的西餐厅
  16. Connect Bot 免密登录
  17. 步进电机运动八大算法
  18. python从零开始爬东方财富网
  19. 利用LM358制作相移电路并通过STC单片机检测相位差
  20. cad详图怎么画_CAD原始结构图如何绘制?

热门文章

  1. 单相桥式有源逆变电路,单相半波可控整流电路,单相桥式半控整流电路,单相桥式全控整流电路
  2. 磊科NW625P做AP
  3. swift UITextField 设置点击确定收回输入框
  4. 如何取消WinRAR评估版本的弹窗提醒
  5. 家用计算机桌,家用电脑桌尺寸一般是多大?
  6. 【和77】火车到底能不能当出租车开呢?(温微观察13-7)
  7. Java 猜字小游戏
  8. 查找知乎的真实IP地址
  9. win10 c语言语音朗读,Win10系统怎样朗读小说
  10. ROS wiki教程翻译