一、过滤器概念

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

二、数据准备

二、Hbase过滤器的分类

比较过滤器

1、行键过滤器——Rowfilter,过滤rowkey=104以前的行

  Filter rowFilter = new RowFilter(CompareFilter.CompareOp.GREATER, new BinaryComparator("104".getBytes()));scan.setFilter(rowFilter);

package com.laotou;import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.*;
import org.apache.hadoop.hbase.client.*;
import org.apache.hadoop.hbase.filter.BinaryComparator;
import org.apache.hadoop.hbase.filter.CompareFilter;
import org.apache.hadoop.hbase.filter.Filter;
import org.apache.hadoop.hbase.filter.RowFilter;
import org.apache.hadoop.hbase.util.Bytes;
/*** @Author: * @Date: 2019/5/17*/
public class Test {private static final String ZK_CONNECT_KEY = "hbase.zookeeper.quorum";private static final String ZK_CONNECT_VALUE = "192.168.200.100,192.168.200.101,192.168.200.102";private static final String ZK_CONNECT_CLIENT = "hbase.zookeeper.property.clientPort";private static final String ZK_CONNECT_CLIENT_PORT = "2181";private static Configuration conf = new Configuration();private static Connection connection = null;public static void main(String[] args) throws Exception {conf.set(ZK_CONNECT_CLIENT,ZK_CONNECT_CLIENT_PORT);conf.set(ZK_CONNECT_KEY,ZK_CONNECT_VALUE);connection = ConnectionFactory.createConnection(conf);scanData();}private static void scanData() throws Exception {//拿到表Table table = connection.getTable(TableName.valueOf("filtertest"));Scan scan=new Scan();Filter rowFilter = new RowFilter(CompareFilter.CompareOp.GREATER, new BinaryComparator("104".getBytes()));scan.setFilter(rowFilter);
//        //调一次返回50的cell,可以减少请求次数
//        scan.setCaching(50);ResultScanner scanner = table.getScanner(scan);//是通过迭代器的方式,每调用 一次next,将光标向下移动一个,所以需要动态修改next对象的值Result next = scanner.next();while (next!=null){//将一个Result中的对象转为一个cell数组Cell[] cells = next.rawCells();for(Cell cell:cells){System.out.println(Bytes.toString(CellUtil.cloneRow(cell))+","+Bytes.toString(CellUtil.cloneFamily(cell))+","+ Bytes.toString(CellUtil.cloneQualifier(cell))+","+Bytes.toString(CellUtil.cloneValue(cell)));}System.out.println();//每循环一次,修改next的值一次next=scanner.next();}scanner.close();table.close();}
}

运行结果部分截图

2、列簇过滤器 FamilyFilter  (将列簇为info的行全部取出来)

Filter familyFilter = new FamilyFilter(CompareFilter.CompareOp.EQUAL, new BinaryComparator("info".getBytes()));scan.setFilter(familyFilter);

package com.laotou;import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.*;
import org.apache.hadoop.hbase.client.*;
import org.apache.hadoop.hbase.filter.*;
import org.apache.hadoop.hbase.util.Bytes;
/*** @Author: * @Date: 2019/5/17*/
public class Test {private static final String ZK_CONNECT_KEY = "hbase.zookeeper.quorum";private static final String ZK_CONNECT_VALUE = "192.168.200.100,192.168.200.101,192.168.200.102";private static final String ZK_CONNECT_CLIENT = "hbase.zookeeper.property.clientPort";private static final String ZK_CONNECT_CLIENT_PORT = "2181";private static Configuration conf = new Configuration();private static Connection connection = null;public static void main(String[] args) throws Exception {conf.set(ZK_CONNECT_CLIENT,ZK_CONNECT_CLIENT_PORT);conf.set(ZK_CONNECT_KEY,ZK_CONNECT_VALUE);connection = ConnectionFactory.createConnection(conf);scanData();}private static void scanData() throws Exception {//拿到表Table table = connection.getTable(TableName.valueOf("filtertest"));Scan scan=new Scan();Filter familyFilter = new FamilyFilter(CompareFilter.CompareOp.EQUAL, new BinaryComparator("info".getBytes()));scan.setFilter(familyFilter);
//        //调一次返回50的cell,可以减少请求次数scan.setCaching(50);ResultScanner scanner = table.getScanner(scan);//是通过迭代器的方式,每调用 一次next,将光标向下移动一个,所以需要动态修改next对象的值Result next = scanner.next();while (next!=null){//将一个Result中的对象转为一个cell数组Cell[] cells = next.rawCells();for(Cell cell:cells){System.out.println(Bytes.toString(CellUtil.cloneRow(cell))+","+Bytes.toString(CellUtil.cloneFamily(cell))+","+ Bytes.toString(CellUtil.cloneQualifier(cell))+","+Bytes.toString(CellUtil.cloneValue(cell)));}System.out.println();//每循环一次,修改next的值一次next=scanner.next();}scanner.close();table.close();}
}

3、列过滤器 QualifierFilter

Filter valueFilter = new ValueFilter(CompareFilter.CompareOp.EQUAL, new SubstringComparator("boy"));scan.setFilter(valueFilter);

 private static void scanData() throws Exception {//拿到表Table table = connection.getTable(TableName.valueOf("filtertest"));Scan scan=new Scan();Filter valueFilter = new ValueFilter(CompareFilter.CompareOp.EQUAL, new SubstringComparator("boy"));scan.setFilter(valueFilter);
//        //调一次返回50的cell,可以减少请求次数scan.setCaching(50);ResultScanner scanner = table.getScanner(scan);//是通过迭代器的方式,每调用 一次next,将光标向下移动一个,所以需要动态修改next对象的值Result next = scanner.next();while (next!=null){//将一个Result中的对象转为一个cell数组Cell[] cells = next.rawCells();for(Cell cell:cells){System.out.println(Bytes.toString(CellUtil.cloneRow(cell))+","+Bytes.toString(CellUtil.cloneFamily(cell))+","+ Bytes.toString(CellUtil.cloneQualifier(cell))+","+Bytes.toString(CellUtil.cloneValue(cell)));}System.out.println();//每循环一次,修改next的值一次next=scanner.next();}scanner.close();table.close();}

4、时间戳过滤器 TimestampsFilter

List<Long> list = new ArrayList<>();list.add( Long.valueOf("1558072555745").longValue());TimestampsFilter timestampsFilter = new TimestampsFilter(list);scan.setFilter(timestampsFilter);

private static void scanData() throws Exception {//拿到表Table table = connection.getTable(TableName.valueOf("filtertest"));Scan scan=new Scan();List<Long> list = new ArrayList<>();list.add( Long.valueOf("1558072555745").longValue());TimestampsFilter timestampsFilter = new TimestampsFilter(list);scan.setFilter(timestampsFilter);
//        //调一次返回50的cell,可以减少请求次数scan.setCaching(50);ResultScanner scanner = table.getScanner(scan);//是通过迭代器的方式,每调用 一次next,将光标向下移动一个,所以需要动态修改next对象的值Result next = scanner.next();while (next!=null){//将一个Result中的对象转为一个cell数组Cell[] cells = next.rawCells();for(Cell cell:cells){System.out.println(Bytes.toString(CellUtil.cloneRow(cell))+","+Bytes.toString(CellUtil.cloneFamily(cell))+","+ Bytes.toString(CellUtil.cloneQualifier(cell))+","+Bytes.toString(CellUtil.cloneValue(cell))+","+cell.getTimestamp());}System.out.println();//每循环一次,修改next的值一次next=scanner.next();}scanner.close();table.close();}

专用过滤器

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

SingleColumnValueFilter singleColumnValueFilter = new SingleColumnValueFilter(        "info".getBytes(), //列簇        "name".getBytes(), //列        CompareFilter.CompareOp.EQUAL,        new SubstringComparator("lisi"));

 private static void scanData() throws Exception {//拿到表Table table = connection.getTable(TableName.valueOf("filtertest"));Scan scan=new Scan();SingleColumnValueFilter singleColumnValueFilter = new SingleColumnValueFilter("info".getBytes(), //列簇"name".getBytes(), //列
                CompareFilter.CompareOp.EQUAL,new SubstringComparator("lisi"));
//如果不设置为 true,则那些不包含指定 column 的行也会返回singleColumnValueFilter.setFilterIfMissing(true);scan.setFilter(singleColumnValueFilter);
//        //调一次返回50的cell,可以减少请求次数scan.setCaching(50);ResultScanner scanner = table.getScanner(scan);//是通过迭代器的方式,每调用 一次next,将光标向下移动一个,所以需要动态修改next对象的值Result next = scanner.next();while (next!=null){//将一个Result中的对象转为一个cell数组Cell[] cells = next.rawCells();for(Cell cell:cells){System.out.println(Bytes.toString(CellUtil.cloneRow(cell))+","+Bytes.toString(CellUtil.cloneFamily(cell))+","+ Bytes.toString(CellUtil.cloneQualifier(cell))+","+Bytes.toString(CellUtil.cloneValue(cell))+","+cell.getTimestamp());}System.out.println();//每循环一次,修改next的值一次next=scanner.next();}scanner.close();table.close();}

2、单列值排除器 SingleColumnValueExcludeFilter

SingleColumnValueExcludeFilter singleColumnValueExcludeFilter = new SingleColumnValueExcludeFilter("info".getBytes(), "name".getBytes(), CompareOp.EQUAL, new SubstringComparator("lisi"));
singleColumnValueExcludeFilter.setFilterIfMissing(true);scan.setFilter(singleColumnValueExcludeFilter);

  private static void scanData() throws Exception {//拿到表Table table = connection.getTable(TableName.valueOf("filtertest"));Scan scan=new Scan();SingleColumnValueExcludeFilter singleColumnValueExcludeFilter = new SingleColumnValueExcludeFilter("info".getBytes(),"name".getBytes(),CompareFilter.CompareOp.EQUAL,new SubstringComparator("lisi"));singleColumnValueExcludeFilter.setFilterIfMissing(true);scan.setFilter(singleColumnValueExcludeFilter);
//        //调一次返回50的cell,可以减少请求次数scan.setCaching(50);ResultScanner scanner = table.getScanner(scan);//是通过迭代器的方式,每调用 一次next,将光标向下移动一个,所以需要动态修改next对象的值Result next = scanner.next();while (next!=null){//将一个Result中的对象转为一个cell数组Cell[] cells = next.rawCells();for(Cell cell:cells){System.out.println(Bytes.toString(CellUtil.cloneRow(cell))+","+Bytes.toString(CellUtil.cloneFamily(cell))+","+ Bytes.toString(CellUtil.cloneQualifier(cell))+","+Bytes.toString(CellUtil.cloneValue(cell))+","+cell.getTimestamp());}System.out.println();//每循环一次,修改next的值一次next=scanner.next();}scanner.close();table.close();}

与上面单列值过滤器相比结果中排除了打印lisi这个字段和值

3、前缀过滤器 PrefixFilter----针对行键,将rowkey以12开头的打印出来

PrefixFilter prefixFilter = new PrefixFilter("12".getBytes());
scan.setFilter(prefixFilter);

package com.laotou;import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.*;
import org.apache.hadoop.hbase.client.*;
import org.apache.hadoop.hbase.filter.*;
import org.apache.hadoop.hbase.util.Bytes;import java.util.ArrayList;
import java.util.List;/*** @Author: * @Date: 2019/5/17*/
public class Test {private static final String ZK_CONNECT_KEY = "hbase.zookeeper.quorum";private static final String ZK_CONNECT_VALUE = "192.168.200.100,192.168.200.101,192.168.200.102";private static final String ZK_CONNECT_CLIENT = "hbase.zookeeper.property.clientPort";private static final String ZK_CONNECT_CLIENT_PORT = "2181";private static Configuration conf = new Configuration();private static Connection connection = null;public static void main(String[] args) throws Exception {conf.set(ZK_CONNECT_CLIENT,ZK_CONNECT_CLIENT_PORT);conf.set(ZK_CONNECT_KEY,ZK_CONNECT_VALUE);connection = ConnectionFactory.createConnection(conf);scanData();}private static void scanData() throws Exception {//拿到表Table table = connection.getTable(TableName.valueOf("filtertest"));Scan scan=new Scan();PrefixFilter prefixFilter = new PrefixFilter("12".getBytes());scan.setFilter(prefixFilter);
//        //调一次返回50的cell,可以减少请求次数scan.setCaching(50);ResultScanner scanner = table.getScanner(scan);//是通过迭代器的方式,每调用 一次next,将光标向下移动一个,所以需要动态修改next对象的值Result next = scanner.next();while (next!=null){//将一个Result中的对象转为一个cell数组Cell[] cells = next.rawCells();for(Cell cell:cells){System.out.println(Bytes.toString(CellUtil.cloneRow(cell))+","+Bytes.toString(CellUtil.cloneFamily(cell))+","+ Bytes.toString(CellUtil.cloneQualifier(cell))+","+Bytes.toString(CellUtil.cloneValue(cell))+","+cell.getTimestamp());}System.out.println();//每循环一次,修改next的值一次next=scanner.next();}scanner.close();table.close();}

4、列前缀过滤器 ColumnPrefixFilter

ColumnPrefixFilter columnPrefixFilter = new ColumnPrefixFilter("name".getBytes());scan.setFilter(columnPrefixFilter);

  private static void scanData() throws Exception {//拿到表Table table = connection.getTable(TableName.valueOf("filtertest"));Scan scan=new Scan();ColumnPrefixFilter columnPrefixFilter = new ColumnPrefixFilter("name".getBytes());scan.setFilter(columnPrefixFilter);
//        //调一次返回50的cell,可以减少请求次数scan.setCaching(50);ResultScanner scanner = table.getScanner(scan);//是通过迭代器的方式,每调用 一次next,将光标向下移动一个,所以需要动态修改next对象的值Result next = scanner.next();while (next!=null){//将一个Result中的对象转为一个cell数组Cell[] cells = next.rawCells();for(Cell cell:cells){System.out.println(Bytes.toString(CellUtil.cloneRow(cell))+","+Bytes.toString(CellUtil.cloneFamily(cell))+","+ Bytes.toString(CellUtil.cloneQualifier(cell))+","+Bytes.toString(CellUtil.cloneValue(cell))+","+cell.getTimestamp());}System.out.println();//每循环一次,修改next的值一次next=scanner.next();}scanner.close();table.close();}

5、分页过滤器 PageFilter

每一页打印两条数据
Filter filter = new PageFilter(2);

private static void scanData() throws Exception {//拿到表Table table = connection.getTable(TableName.valueOf("filtertest"));Scan scan=new Scan();Filter filter = new PageFilter(2);scan.setFilter(filter);
//        //调一次返回50的cell,可以减少请求次数scan.setCaching(50);ResultScanner scanner = table.getScanner(scan);//是通过迭代器的方式,每调用 一次next,将光标向下移动一个,所以需要动态修改next对象的值Result next = scanner.next();while (next!=null){//将一个Result中的对象转为一个cell数组Cell[] cells = next.rawCells();for(Cell cell:cells){System.out.println(Bytes.toString(CellUtil.cloneRow(cell))+","+Bytes.toString(CellUtil.cloneFamily(cell))+","+ Bytes.toString(CellUtil.cloneQualifier(cell))+","+Bytes.toString(CellUtil.cloneValue(cell))+","+cell.getTimestamp());}System.out.println();//每循环一次,修改next的值一次next=scanner.next();}scanner.close();table.close();}

6、行键范围过滤 [startkey,endkey),结果为左闭右开

 scan.setStartRow(Bytes.toBytes("115"));scan.setStopRow(Bytes.toBytes("117"));

private static void scanData() throws Exception {//拿到表Table table = connection.getTable(TableName.valueOf("filtertest"));Scan scan=new Scan();scan.setStartRow(Bytes.toBytes("115"));scan.setStopRow(Bytes.toBytes("117"));
//        //调一次返回50的cell,可以减少请求次数scan.setCaching(50);ResultScanner scanner = table.getScanner(scan);//是通过迭代器的方式,每调用 一次next,将光标向下移动一个,所以需要动态修改next对象的值Result next = scanner.next();while (next!=null){//将一个Result中的对象转为一个cell数组Cell[] cells = next.rawCells();for(Cell cell:cells){System.out.println(Bytes.toString(CellUtil.cloneRow(cell))+","+Bytes.toString(CellUtil.cloneFamily(cell))+","+ Bytes.toString(CellUtil.cloneQualifier(cell))+","+Bytes.toString(CellUtil.cloneValue(cell))+","+cell.getTimestamp());}System.out.println();//每循环一次,修改next的值一次next=scanner.next();}scanner.close();table.close();}

转载于:https://www.cnblogs.com/yfb918/p/10641718.html

Hbase之过滤器的使用相关推荐

  1. Hbase的过滤器查询

    hbase过滤器的比较运算符: LESS < LESS_OR_EQUAL <= EQUAL = NOT_EQUAL <> GREATER_OR_EQUAL >= GREA ...

  2. spark读Hbase数据集成Hbase Filter(过滤器)

    文章目录 过滤器简介 spark 读Hbase集成Filter TableInputFormat 源码 代码示例 基于hbase版本2.3.5 过滤器简介 Hbase 提供了种类丰富的过滤器(filt ...

  3. Hbase关于过滤器对表的操作

    Hbase关于过滤器对表的操作 使用过滤器对表操作 Hbase关于过滤器对表的操作 scan方法实例 过滤器有:行键过滤器.列族与列过滤器.值过滤器.时间过滤器.行键过滤器 行键过滤器 列族与列过滤器 ...

  4. HBase - Filter - 过滤器的介绍以及使用

    博文作者:那伊抹微笑 csdn 博客地址:http://blog.csdn.net/u012185296 1 过滤器 HBase 的基本 API,包括增.删.改.查等. 增.删都是相对简单的操作,与传 ...

  5. HBase Filter 过滤器概述

    HBase过滤器是一套为完成一些较高级的需求所提供的API接口. 过滤器也被称为下推判断器(push-down predicates),支持把数据过滤标准从客户端下推到服务器,带有 Filter 条件 ...

  6. 在Hbase使用过滤器(行键过滤器、列族与列过滤器、值过滤器)

    本文介绍Hbase中的过滤器: 1.行键过滤器 2.列族与列过滤器 3.值过滤器 4.其他过滤器 格式如下: scan'表名',{FILTER=>过滤器(比较运算符,'比较器')"} ...

  7. HBase布隆过滤器简介

    上面是一个布隆过滤器的简略工作图. 布隆过滤器的特点: --能判断该HFile一定没有要查找的数据,但不能判断有.每一个HFile都有一个布隆过滤器. 原理:会维护一个数组,一开始数组元素都是0.   ...

  8. HBase常用过滤器

    列值过滤器 SingleColumnValueFilter filter = new SingleColumnValueFilter(Bytes.toBytes(HBRunner.DEFAULT_FA ...

  9. Hbase过滤器(Filter)汇总

    Filter CompareFilter 是高层的抽象类,下面我们将看到他的实现类和实现类代表的各种过滤条件 RowFilter,FamliyFilter,QualifierFilter,ValueF ...

  10. HBase的布隆过滤器详解

    HBase的布隆过滤器详解 1.布隆过滤器的简单介绍 2.布隆过滤器的原理分析 2.1 哈希表存在的问题 2.2 布隆过滤器的原理 2.2.1 原理详解 2.2.2 布隆过滤器失误率的调节 2.2.3 ...

最新文章

  1. 解决XP系统下HTTP 错误 403.9 - 禁止访问:连接的用户过多的问题
  2. boost::mp11::construct_from_tuple相关用法的测试程序
  3. 《DBNotes:Join算法的前世今生》
  4. 通过webbrowser实现js与winform的相互调用
  5. sqlite3数据库使用
  6. python中的return和print的区别_python中return和print的区别(详细)
  7. Java8 stream().map()将对象转换为其他对象
  8. C++ 重载左移和右移运算符
  9. hive开启kerberos-beeline连接
  10. delphi 子接口是否实现父接口_您可以从子类接口的接口调用父接口的默认方法吗?...
  11. Merkle Tree与区块链
  12. 服务器自带raid功能吗,服务器的 RAID 功能介绍
  13. 大一c语言程序考试常考程序题,C语言程序常考题
  14. vs2005 安装sp1补丁问题汇总及安装解决方案,希望有大家有帮助
  15. matlab发动机建模,基于MATLAB/SIMULINK的航空发动机建模与仿真研究
  16. 软件测试员最核心的竞争力究竟是什么
  17. 分享几个做CTF的网站
  18. 电商业务Alipay支付实战(当面付实现)
  19. 基于https搭建habor私有库
  20. 2022/9/11 Python进阶--Linux版 持续更新

热门文章

  1. 那个清华哈佛双料女学霸, 辞职了
  2. 荐号 | “看一看”中“偷”来的很棒的公众号
  3. Visual Studio 开发(三):Visual Studio 使用时常见问题解决方案
  4. Web Clip 图片变淡变浅变灰解决方案
  5. Acunetix Web Vulnarability Scanner V10.5 详细中文手册
  6. TEST ON 平安夜
  7. SGU[222] Little Rooks
  8. Search in Rotated Sorted Array II leetcode java
  9. k3cloud报表单击列表某字段,弹出相应的单据
  10. SpringMVC是单例的