Hbase之过滤器的使用
一、过滤器概念
基础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之过滤器的使用相关推荐
- Hbase的过滤器查询
hbase过滤器的比较运算符: LESS < LESS_OR_EQUAL <= EQUAL = NOT_EQUAL <> GREATER_OR_EQUAL >= GREA ...
- spark读Hbase数据集成Hbase Filter(过滤器)
文章目录 过滤器简介 spark 读Hbase集成Filter TableInputFormat 源码 代码示例 基于hbase版本2.3.5 过滤器简介 Hbase 提供了种类丰富的过滤器(filt ...
- Hbase关于过滤器对表的操作
Hbase关于过滤器对表的操作 使用过滤器对表操作 Hbase关于过滤器对表的操作 scan方法实例 过滤器有:行键过滤器.列族与列过滤器.值过滤器.时间过滤器.行键过滤器 行键过滤器 列族与列过滤器 ...
- HBase - Filter - 过滤器的介绍以及使用
博文作者:那伊抹微笑 csdn 博客地址:http://blog.csdn.net/u012185296 1 过滤器 HBase 的基本 API,包括增.删.改.查等. 增.删都是相对简单的操作,与传 ...
- HBase Filter 过滤器概述
HBase过滤器是一套为完成一些较高级的需求所提供的API接口. 过滤器也被称为下推判断器(push-down predicates),支持把数据过滤标准从客户端下推到服务器,带有 Filter 条件 ...
- 在Hbase使用过滤器(行键过滤器、列族与列过滤器、值过滤器)
本文介绍Hbase中的过滤器: 1.行键过滤器 2.列族与列过滤器 3.值过滤器 4.其他过滤器 格式如下: scan'表名',{FILTER=>过滤器(比较运算符,'比较器')"} ...
- HBase布隆过滤器简介
上面是一个布隆过滤器的简略工作图. 布隆过滤器的特点: --能判断该HFile一定没有要查找的数据,但不能判断有.每一个HFile都有一个布隆过滤器. 原理:会维护一个数组,一开始数组元素都是0. ...
- HBase常用过滤器
列值过滤器 SingleColumnValueFilter filter = new SingleColumnValueFilter(Bytes.toBytes(HBRunner.DEFAULT_FA ...
- Hbase过滤器(Filter)汇总
Filter CompareFilter 是高层的抽象类,下面我们将看到他的实现类和实现类代表的各种过滤条件 RowFilter,FamliyFilter,QualifierFilter,ValueF ...
- HBase的布隆过滤器详解
HBase的布隆过滤器详解 1.布隆过滤器的简单介绍 2.布隆过滤器的原理分析 2.1 哈希表存在的问题 2.2 布隆过滤器的原理 2.2.1 原理详解 2.2.2 布隆过滤器失误率的调节 2.2.3 ...
最新文章
- 解决XP系统下HTTP 错误 403.9 - 禁止访问:连接的用户过多的问题
- boost::mp11::construct_from_tuple相关用法的测试程序
- 《DBNotes:Join算法的前世今生》
- 通过webbrowser实现js与winform的相互调用
- sqlite3数据库使用
- python中的return和print的区别_python中return和print的区别(详细)
- Java8 stream().map()将对象转换为其他对象
- C++ 重载左移和右移运算符
- hive开启kerberos-beeline连接
- delphi 子接口是否实现父接口_您可以从子类接口的接口调用父接口的默认方法吗?...
- Merkle Tree与区块链
- 服务器自带raid功能吗,服务器的 RAID 功能介绍
- 大一c语言程序考试常考程序题,C语言程序常考题
- vs2005 安装sp1补丁问题汇总及安装解决方案,希望有大家有帮助
- matlab发动机建模,基于MATLAB/SIMULINK的航空发动机建模与仿真研究
- 软件测试员最核心的竞争力究竟是什么
- 分享几个做CTF的网站
- 电商业务Alipay支付实战(当面付实现)
- 基于https搭建habor私有库
- 2022/9/11 Python进阶--Linux版 持续更新
热门文章
- 那个清华哈佛双料女学霸, 辞职了
- 荐号 | “看一看”中“偷”来的很棒的公众号
- Visual Studio 开发(三):Visual Studio 使用时常见问题解决方案
- Web Clip 图片变淡变浅变灰解决方案
- Acunetix Web Vulnarability Scanner V10.5 详细中文手册
- TEST ON 平安夜
- SGU[222] Little Rooks
- Search in Rotated Sorted Array II leetcode java
- k3cloud报表单击列表某字段,弹出相应的单据
- SpringMVC是单例的