过滤器(Filter)

  基础API中的查询操作在面对大量数据的时候是非常苍白的,这里Hbase提供了高级的查询方法:Filter。Filter可以根据簇、列、版本等更多的条件来对数据进行过滤,基于Hbase本身提供的三维有序(主键有序、列有序、版本有序),这些Filter可以高效的完成查询过滤的任务。带有Filter条件的RPC查询请求会把Filter分发到各个RegionServer,是一个服务器端(Server-side)的过滤器,这样也可以降低网络传输的压力。

  要完成一个过滤的操作,至少需要两个参数。一个是抽象的操作符,Hbase提供了枚举类型的变量来表示这些抽象的操作符:LESS/LESS_OR_EQUAL/EQUAL/NOT_EUQAL等;另外一个就是具体的比较器(Comparator),代表具体的比较逻辑,如果可以提高字节级的比较、字符串级的比较等。有了这两个参数,我们就可以清晰的定义筛选的条件,过滤数据。

抽象操作符(比较运算符)

LESS <

LESS_OR_EQUAL <=

EQUAL =

NOT_EQUAL <>

GREATER_OR_EQUAL >=

GREATER >

NO_OP 排除所有

比较器(指定比较机制)

BinaryComparator 按字节索引顺序比较指定字节数组,采用 Bytes.compareTo(byte[])

BinaryPrefixComparator 跟前面相同,只是比较左端的数据是否相同

NullComparator 判断给定的是否为空

BitComparator 按位比较

RegexStringComparator 提供一个正则的比较器,仅支持 EQUAL 和非 EQUAL

SubstringComparator 判断提供的子串是否出现在 value 中

HBase过滤器的分类

比较过滤器

1、行键过滤器 RowFilter

  1. Filter rowFilter = new RowFilter(CompareOp.GREATER, new BinaryComparator("95007".getBytes()));
  2. scan.setFilter(rowFilter);
  1. public class HbaseFilterTest {
  2.  
  3. private static final String ZK_CONNECT_KEY = "hbase.zookeeper.quorum";
  4. private static final String ZK_CONNECT_VALUE = "hadoop1:2181,hadoop2:2181,hadoop3:2181";
  5.  
  6. private static Connection conn = null;
  7. private static Admin admin = null;
  8.  
  9. public static void main(String[] args) throws Exception {
  10.  
  11. Configuration conf = HBaseConfiguration.create();
  12. conf.set(ZK_CONNECT_KEY, ZK_CONNECT_VALUE);
  13. conn = ConnectionFactory.createConnection(conf);
  14. admin = conn.getAdmin();
  15. Table table = conn.getTable(TableName.valueOf("student"));
  16.  
  17. Scan scan = new Scan();
  18.  
  19. Filter rowFilter = new RowFilter(CompareOp.GREATER, new BinaryComparator("95007".getBytes()));
  20. scan.setFilter(rowFilter);
  21. ResultScanner resultScanner = table.getScanner(scan);
  22. for(Result result : resultScanner) {
  23. List<Cell> cells = result.listCells();
  24. for(Cell cell : cells) {
  25. System.out.println(cell);
  26. }
  27. }
  28.  
  29. }

运行结果部分截图

2、列簇过滤器 FamilyFilter

  1. Filter familyFilter = new FamilyFilter(CompareOp.EQUAL, new BinaryComparator("info".getBytes()));
  2. scan.setFilter(familyFilter);
  1. public class HbaseFilterTest {
  2.  
  3. private static final String ZK_CONNECT_KEY = "hbase.zookeeper.quorum";
  4. private static final String ZK_CONNECT_VALUE = "hadoop1:2181,hadoop2:2181,hadoop3:2181";
  5.  
  6. private static Connection conn = null;
  7. private static Admin admin = null;
  8.  
  9. public static void main(String[] args) throws Exception {
  10.  
  11. Configuration conf = HBaseConfiguration.create();
  12. conf.set(ZK_CONNECT_KEY, ZK_CONNECT_VALUE);
  13. conn = ConnectionFactory.createConnection(conf);
  14. admin = conn.getAdmin();
  15. Table table = conn.getTable(TableName.valueOf("student"));
  16.  
  17. Scan scan = new Scan();
  18.  
  19. Filter familyFilter = new FamilyFilter(CompareOp.EQUAL, new BinaryComparator("info".getBytes()));
  20. scan.setFilter(familyFilter);
  21. ResultScanner resultScanner = table.getScanner(scan);
  22. for(Result result : resultScanner) {
  23. List<Cell> cells = result.listCells();
  24. for(Cell cell : cells) {
  25. System.out.println(cell);
  26. }
  27. }
  28.  
  29. }
  30.  
  31. }

3、列过滤器 QualifierFilter

  1. Filter qualifierFilter = new QualifierFilter(CompareOp.EQUAL, new BinaryComparator("name".getBytes()));
  2. scan.setFilter(qualifierFilter);
  1. public class HbaseFilterTest {
  2.  
  3. private static final String ZK_CONNECT_KEY = "hbase.zookeeper.quorum";
  4. private static final String ZK_CONNECT_VALUE = "hadoop1:2181,hadoop2:2181,hadoop3:2181";
  5.  
  6. private static Connection conn = null;
  7. private static Admin admin = null;
  8.  
  9. public static void main(String[] args) throws Exception {
  10.  
  11. Configuration conf = HBaseConfiguration.create();
  12. conf.set(ZK_CONNECT_KEY, ZK_CONNECT_VALUE);
  13. conn = ConnectionFactory.createConnection(conf);
  14. admin = conn.getAdmin();
  15. Table table = conn.getTable(TableName.valueOf("student"));
  16.  
  17. Scan scan = new Scan();
  18.  
  19. Filter qualifierFilter = new QualifierFilter(CompareOp.EQUAL, new BinaryComparator("name".getBytes()));
  20. scan.setFilter(qualifierFilter);
  21. ResultScanner resultScanner = table.getScanner(scan);
  22. for(Result result : resultScanner) {
  23. List<Cell> cells = result.listCells();
  24. for(Cell cell : cells) {
  25. System.out.println(cell);
  26. }
  27. }
  28.  
  29. }
  30.  
  31. }

4、值过滤器 ValueFilter

  1. Filter valueFilter = new ValueFilter(CompareOp.EQUAL, new SubstringComparator("男"));
  2. scan.setFilter(valueFilter);
  1. public class HbaseFilterTest {
  2.  
  3. private static final String ZK_CONNECT_KEY = "hbase.zookeeper.quorum";
  4. private static final String ZK_CONNECT_VALUE = "hadoop1:2181,hadoop2:2181,hadoop3:2181";
  5.  
  6. private static Connection conn = null;
  7. private static Admin admin = null;
  8.  
  9. public static void main(String[] args) throws Exception {
  10.  
  11. Configuration conf = HBaseConfiguration.create();
  12. conf.set(ZK_CONNECT_KEY, ZK_CONNECT_VALUE);
  13. conn = ConnectionFactory.createConnection(conf);
  14. admin = conn.getAdmin();
  15. Table table = conn.getTable(TableName.valueOf("student"));
  16.  
  17. Scan scan = new Scan();
  18.  
  19. Filter valueFilter = new ValueFilter(CompareOp.EQUAL, new SubstringComparator("男"));
  20. scan.setFilter(valueFilter);
  21. ResultScanner resultScanner = table.getScanner(scan);
  22. for(Result result : resultScanner) {
  23. List<Cell> cells = result.listCells();
  24. for(Cell cell : cells) {
  25. System.out.println(cell);
  26. }
  27. }
  28.  
  29. }
  30.  
  31. }

5、时间戳过滤器 TimestampsFilter

  1. List<Long> list = new ArrayList<>();
  2. list.add(1522469029503l);
  3. TimestampsFilter timestampsFilter = new TimestampsFilter(list);
  4. scan.setFilter(timestampsFilter);
  1. public class HbaseFilterTest {
  2.  
  3. private static final String ZK_CONNECT_KEY = "hbase.zookeeper.quorum";
  4. private static final String ZK_CONNECT_VALUE = "hadoop1:2181,hadoop2:2181,hadoop3:2181";
  5.  
  6. private static Connection conn = null;
  7. private static Admin admin = null;
  8.  
  9. public static void main(String[] args) throws Exception {
  10.  
  11. Configuration conf = HBaseConfiguration.create();
  12. conf.set(ZK_CONNECT_KEY, ZK_CONNECT_VALUE);
  13. conn = ConnectionFactory.createConnection(conf);
  14. admin = conn.getAdmin();
  15. Table table = conn.getTable(TableName.valueOf("student"));
  16.  
  17. Scan scan = new Scan();
  18.  
  19. List<Long> list = new ArrayList<>();
  20. list.add(1522469029503l);
  21. TimestampsFilter timestampsFilter = new TimestampsFilter(list);
  22. scan.setFilter(timestampsFilter);
  23. ResultScanner resultScanner = table.getScanner(scan);
  24. for(Result result : resultScanner) {
  25. List<Cell> cells = result.listCells();
  26. for(Cell cell : cells) {
  27. System.out.println(Bytes.toString(cell.getRow()) + "\t" + Bytes.toString(cell.getFamily()) + "\t" + Bytes.toString(cell.getQualifier())
  28. + "\t" + Bytes.toString(cell.getValue()) + "\t" + cell.getTimestamp());
  29. }
  30. }
  31.  
  32. }
  33.  
  34. }

专用过滤器

1、单列值过滤器 SingleColumnValueFilter ----会返回满足条件的整行

  1. SingleColumnValueFilter singleColumnValueFilter = new SingleColumnValueFilter(
  2. "info".getBytes(), //列簇
  3. "name".getBytes(), //列
  4. CompareOp.EQUAL,
  5. new SubstringComparator("刘晨"));
  6. //如果不设置为 true,则那些不包含指定 column 的行也会返回
  7. singleColumnValueFilter.setFilterIfMissing(true);
  8. scan.setFilter(singleColumnValueFilter);
  1. public class HbaseFilterTest2 {
  2.  
  3. private static final String ZK_CONNECT_KEY = "hbase.zookeeper.quorum";
  4. private static final String ZK_CONNECT_VALUE = "hadoop1:2181,hadoop2:2181,hadoop3:2181";
  5.  
  6. private static Connection conn = null;
  7. private static Admin admin = null;
  8.  
  9. public static void main(String[] args) throws Exception {
  10.  
  11. Configuration conf = HBaseConfiguration.create();
  12. conf.set(ZK_CONNECT_KEY, ZK_CONNECT_VALUE);
  13. conn = ConnectionFactory.createConnection(conf);
  14. admin = conn.getAdmin();
  15. Table table = conn.getTable(TableName.valueOf("student"));
  16.  
  17. Scan scan = new Scan();
  18.  
  19. SingleColumnValueFilter singleColumnValueFilter = new SingleColumnValueFilter(
  20. "info".getBytes(),
  21. "name".getBytes(),
  22. CompareOp.EQUAL,
  23. new SubstringComparator("刘晨"));
  24. singleColumnValueFilter.setFilterIfMissing(true);
  25.  
  26. scan.setFilter(singleColumnValueFilter);
  27. ResultScanner resultScanner = table.getScanner(scan);
  28. for(Result result : resultScanner) {
  29. List<Cell> cells = result.listCells();
  30. for(Cell cell : cells) {
  31. System.out.println(Bytes.toString(cell.getRow()) + "\t" + Bytes.toString(cell.getFamily()) + "\t" + Bytes.toString(cell.getQualifier())
  32. + "\t" + Bytes.toString(cell.getValue()) + "\t" + cell.getTimestamp());
  33. }
  34. }
  35.  
  36. }
  37.  
  38. }

2、单列值排除器 SingleColumnValueExcludeFilter

  1. SingleColumnValueExcludeFilter singleColumnValueExcludeFilter = new SingleColumnValueExcludeFilter(
  2. "info".getBytes(),
  3. "name".getBytes(),
  4. CompareOp.EQUAL,
  5. new SubstringComparator("刘晨"));
  6. singleColumnValueExcludeFilter.setFilterIfMissing(true);
  7.  
  8. scan.setFilter(singleColumnValueExcludeFilter);
  1. public class HbaseFilterTest2 {
  2.  
  3. private static final String ZK_CONNECT_KEY = "hbase.zookeeper.quorum";
  4. private static final String ZK_CONNECT_VALUE = "hadoop1:2181,hadoop2:2181,hadoop3:2181";
  5.  
  6. private static Connection conn = null;
  7. private static Admin admin = null;
  8.  
  9. public static void main(String[] args) throws Exception {
  10.  
  11. Configuration conf = HBaseConfiguration.create();
  12. conf.set(ZK_CONNECT_KEY, ZK_CONNECT_VALUE);
  13. conn = ConnectionFactory.createConnection(conf);
  14. admin = conn.getAdmin();
  15. Table table = conn.getTable(TableName.valueOf("student"));
  16.  
  17. Scan scan = new Scan();
  18.  
  19. SingleColumnValueExcludeFilter singleColumnValueExcludeFilter = new SingleColumnValueExcludeFilter(
  20. "info".getBytes(),
  21. "name".getBytes(),
  22. CompareOp.EQUAL,
  23. new SubstringComparator("刘晨"));
  24. singleColumnValueExcludeFilter.setFilterIfMissing(true);
  25.  
  26. scan.setFilter(singleColumnValueExcludeFilter);
  27. ResultScanner resultScanner = table.getScanner(scan);
  28. for(Result result : resultScanner) {
  29. List<Cell> cells = result.listCells();
  30. for(Cell cell : cells) {
  31. System.out.println(Bytes.toString(cell.getRow()) + "\t" + Bytes.toString(cell.getFamily()) + "\t" + Bytes.toString(cell.getQualifier())
  32. + "\t" + Bytes.toString(cell.getValue()) + "\t" + cell.getTimestamp());
  33. }
  34. }
  35.  
  36. }
  37.  
  38. }

3、前缀过滤器 PrefixFilter----针对行键

  1. PrefixFilter prefixFilter = new PrefixFilter("9501".getBytes());
  2.  
  3. scan.setFilter(prefixFilter);
  1. public class HbaseFilterTest2 {
  2.  
  3. private static final String ZK_CONNECT_KEY = "hbase.zookeeper.quorum";
  4. private static final String ZK_CONNECT_VALUE = "hadoop1:2181,hadoop2:2181,hadoop3:2181";
  5.  
  6. private static Connection conn = null;
  7. private static Admin admin = null;
  8.  
  9. public static void main(String[] args) throws Exception {
  10.  
  11. Configuration conf = HBaseConfiguration.create();
  12. conf.set(ZK_CONNECT_KEY, ZK_CONNECT_VALUE);
  13. conn = ConnectionFactory.createConnection(conf);
  14. admin = conn.getAdmin();
  15. Table table = conn.getTable(TableName.valueOf("student"));
  16.  
  17. Scan scan = new Scan();
  18.  
  19. PrefixFilter prefixFilter = new PrefixFilter("9501".getBytes());
  20.  
  21. scan.setFilter(prefixFilter);
  22. ResultScanner resultScanner = table.getScanner(scan);
  23. for(Result result : resultScanner) {
  24. List<Cell> cells = result.listCells();
  25. for(Cell cell : cells) {
  26. System.out.println(Bytes.toString(cell.getRow()) + "\t" + Bytes.toString(cell.getFamily()) + "\t" + Bytes.toString(cell.getQualifier())
  27. + "\t" + Bytes.toString(cell.getValue()) + "\t" + cell.getTimestamp());
  28. }
  29. }
  30.  
  31. }
  32.  
  33. }

4、列前缀过滤器 ColumnPrefixFilter

  1. ColumnPrefixFilter columnPrefixFilter = new ColumnPrefixFilter("name".getBytes());
  2.  
  3. scan.setFilter(columnPrefixFilter);
  1. public class HbaseFilterTest2 {
  2.  
  3. private static final String ZK_CONNECT_KEY = "hbase.zookeeper.quorum";
  4. private static final String ZK_CONNECT_VALUE = "hadoop1:2181,hadoop2:2181,hadoop3:2181";
  5.  
  6. private static Connection conn = null;
  7. private static Admin admin = null;
  8.  
  9. public static void main(String[] args) throws Exception {
  10.  
  11. Configuration conf = HBaseConfiguration.create();
  12. conf.set(ZK_CONNECT_KEY, ZK_CONNECT_VALUE);
  13. conn = ConnectionFactory.createConnection(conf);
  14. admin = conn.getAdmin();
  15. Table table = conn.getTable(TableName.valueOf("student"));
  16.  
  17. Scan scan = new Scan();
  18.  
  19. ColumnPrefixFilter columnPrefixFilter = new ColumnPrefixFilter("name".getBytes());
  20.  
  21. scan.setFilter(columnPrefixFilter);
  22. ResultScanner resultScanner = table.getScanner(scan);
  23. for(Result result : resultScanner) {
  24. List<Cell> cells = result.listCells();
  25. for(Cell cell : cells) {
  26. System.out.println(Bytes.toString(cell.getRow()) + "\t" + Bytes.toString(cell.getFamily()) + "\t" + Bytes.toString(cell.getQualifier())
  27. + "\t" + Bytes.toString(cell.getValue()) + "\t" + cell.getTimestamp());
  28. }
  29. }
  30.  
  31. }
  32.  
  33. }

5、分页过滤器 PageFilter

HBase学习之路 (六)过滤器的更多相关文章

  1. Hbase学习(三)过滤器 java API

    Hbase学习(三)过滤器 HBase 的基本 API,包括增.删.改.查等. 增.删都是相对简单的操作,与传统的 RDBMS 相比,这里的查询操作略显苍白,只能根据特性的行键进行查询(Get)或者根 ...

  2. HBase 学习之路(七)——HBase过滤器详解

    一.HBase过滤器简介 Hbase提供了种类丰富的过滤器(filter)来提高数据处理的效率,用户可以通过内置或自定义的过滤器来对数据进行过滤,所有的过滤器都在服务端生效,即谓词下推(predica ...

  3. HBase学习之路 (十一)HBase的协过滤器

    协处理器—Coprocessor 1. 起源 Hbase 作为列族数据库最经常被人诟病的特性包括:无法轻易建立“二级索引”,难以执 行求和.计数.排序等操作.比如,在旧版本的(<0.92)Hba ...

  4. HBase 学习之路(六)——HBase Java API 的基本使用

    一.简述 截至到目前(2019.04),HBase 有两个主要的版本,分别是1.x 和 2.x ,两个版本的Java API有所不同,1.x 中某些方法在2.x中被标识为@deprecated过时.所 ...

  5. HBase学习之路 (七)HBase 原理

    系统架构 错误图解 这张图是有一个错误点:应该是每一个 RegionServer 就只有一个 HLog,而不是一个 Region 有一个 HLog. 正确图解 从HBase的架构图上可以看出,HBas ...

  6. HBase 学习之路(十)—— HBase的SQL中间层 Phoenix

    一.Phoenix简介 Phoenix是HBase的开源SQL中间层,它允许你使用标准JDBC的方式来操作HBase上的数据.在Phoenix之前,如果你要访问HBase,只能调用它的Java API ...

  7. HBase 学习之路(八)——HBase协处理器

    一.简述 在使用HBase时,如果你的数据量达到了数十亿行或数百万列,此时能否在查询中返回大量数据将受制于网络的带宽,即便网络状况允许,但是客户端的计算处理也未必能够满足要求.在这种情况下,协处理器( ...

  8. HBase 学习之路(一)—— HBase简介

    一.Hadoop的局限 HBase是一个构建在Hadoop文件系统之上的面向列的数据库管理系统. 要想明白为什么产生HBase,就需要先了解一下Hadoop存在的限制?Hadoop可以通过HDFS来存 ...

  9. zigbee学习之路(六):Time3(查询方式)

    一.前言 通过上次的学习,相信大家对cc2530单片机的定时器的使用有了一定的了解,今天我们来介绍定时器3的使用,为什么介绍定时器3呢,因为它和定时器4功能是差不多的,所以学会定时器3,就基本掌握了c ...

随机推荐

  1. redis入门基础

    环境: centos 一.安装 sudo su cd wget http://labfile.oss.aliyuncs.com/courses/106/redis-2.8.4.tar.gz tar - ...

  2. POJ1426(KB1-E 暴力搜索)

    Find The Multiple   Description Given a positive integer n, write a program to find out a nonzero mu ...

  3. 第二十六天- C/S架构 通信流程 socket

    1.C/S架构 C/S架构:Client与Server ,中文意思:客户端与服务器端架构,这种架构也是从用户层面(也可是物理层面)来划分的.这里客户端一般指需先安装再执行的应用程序,对操作系统依赖性较 ...

  4. c#如何禁用win7的任务管理器

    以前制作的桌面锁屏软件虽然也禁用过任务管理器,但是采取的是比较笨的方法,而且对操作系统还有一定的危害.因为任务管理也是一个窗体也就是说它中也是一个独立进程,所以只需要强制性关闭这个进程即可以关闭任务管 ...

  5. redux、immutablejs和mobx性能对比(一)

    一.前言 关于react的性能优化,有很多方面可以去做,而其中避免重复渲染又是比较重要的一点,那么为什么react会重复渲染,我们又该如何避免重复渲染呢,关于这方面官方其实早有说明:避免重复渲染,这里 ...

  6. php5.5过渡--mysql连接

    以前: // $conn=mysql_connect("localhost","root","");// $db=mysql_select_ ...

  7. drupal7 addExpression+union+分页

    global $user; $query_single = db_select('mp_order_singlepay', 'ms') ->fields('ms', array('order_i ...

  8. Html5不可见标签,及标签属性(元素对象属性) a href target name id 相对路径

    标签属性分类(元素对象属性) 不可见标签与可见标签: <head></head>        属于不可见标签, 里面的内容一般用于css还有全局的一些变量,声明等. 而且如果 ...

  9. 行内元素和块级元素的具体区别是什么?inline-block是什么?(面试题目)

    一,行内元素与块级元素的区别: 1.行内元素与块级元素直观上的区别二.行内元素与块级元素的三个区别 行内元素会在一条直线上排列(默认宽度只与内容有关),都是同一行的,水平方向排列. 块级元素各占据一行 ...

  10. wkhtmltopdf中文参数

    wkhtmltopdf [OPTIONS]... [More input files] 常规选项 --allow <path> 允许加载从指定的文件夹中的文件或文件(可重复) --book ...