HBase过滤器的使用
一、常用过滤器:
1、数据准备:
Rowkey:001 Family:Quilfifier address value: 昆明市西山区
Rowkey:001 Family:Quilfifier age value: 23
Rowkey:001 Family:Quilfifier name value: 小明
Rowkey:001 Family:Quilfifier personType value: 布控人员,涉恐人员,线索人员
Rowkey:001 Family:Quilfifier zjhm value: 620302199822332832
Rowkey:002 Family:Quilfifier address value: 昆明市西山区福海路
Rowkey:002 Family:Quilfifier age value: 33
Rowkey:002 Family:Quilfifier name value: 小李
Rowkey:002 Family:Quilfifier personType value: 重点人员,涉恐人员,线索人员
Rowkey:002 Family:Quilfifier zjhm value: 620302199822332442
Rowkey:003 Family:Quilfifier address value: 昆明市西山区福海路
Rowkey:003 Family:Quilfifier age value: 34
Rowkey:003 Family:Quilfifier name value: 小王
Rowkey:003 Family:Quilfifier personType value: 重点人员,涉恐人员,在控人员
Rowkey:003 Family:Quilfifier zjhm value: 620302192398432442
Rowkey:004 Family:Quilfifier address value: 昆明市滇池路
Rowkey:004 Family:Quilfifier age value: 45
Rowkey:004 Family:Quilfifier name value: 小花
Rowkey:004 Family:Quilfifier personType value: 涉恐人员,线索人员
Rowkey:004 Family:Quilfifier zjhm value: 643020304050403436
Rowkey:005 Family:Quilfifier address value: 云南省西双版纳
Rowkey:005 Family:Quilfifier age value: 60
Rowkey:005 Family:Quilfifier name value: 小马
Rowkey:005 Family:Quilfifier personType value: ,涉案人员,涉恐人员,线索人员
Rowkey:005 Family:Quilfifier zjhm value: 643020302938413436
Rowkey:006 Family:Quilfifier address value: 北京市朝阳区
Rowkey:006 Family:Quilfifier age value: 66
Rowkey:006 Family:Quilfifier name value: 大壮
Rowkey:006 Family:Quilfifier personType value: 良民
Rowkey:006 Family:Quilfifier zjhm value: 673747322344384456
2、过滤器的使用:
package HBase; 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.TableName;
import org.apache.hadoop.hbase.client.*;
import org.apache.hadoop.hbase.filter.*;
import org.apache.hadoop.hbase.util.Bytes; import java.io.IOException;
import java.util.ArrayList;
import java.util.List; public class Operator {
public static Admin admin = null;
public static Connection conn = null; public Connection getConn() throws IOException { Configuration hbaseConf = HBaseConfiguration.create();
hbaseConf.set("hbase.zookeeper.quorum","master:2181,slave1:2181,slave2:2181");
hbaseConf.set("hbase.zookeeper.quorum", "master:2181");
Connection HbaseConn = ConnectionFactory.createConnection(hbaseConf);
return HbaseConn;
} public Operator() {
try {
conn = Hbase.getConnection();
admin = conn.getAdmin();
} catch (Exception e) {
e.getMessage();
}
} public static void main(String[] args) throws Exception {
Operator operator = new Operator();
operator.filter("person");
// operator.pageFilter("person");
} /**
* SingleColumnValueFilter和SingleColumnValueExcludeFilter
* 用来查找并返回指定条件的列的数据
* a,如果查找时没有该列,两种filter都会把该行所有数据返回
* b,如果查找时有该列,但是不符合条件,则该行所有列都不返回
* c,如果找到该列,并且符合条件,前者返回所有列,后者返回除该列以外的所有
*/
public void filter(String tableName) throws Exception {
Table table = conn.getTable(TableName.valueOf(tableName));
Scan scan = new Scan();
//SingleColumnValueFilter:二进制比较器,完整匹配字节数组,返回匹配到的整行
Filter filter = new SingleColumnValueFilter(Bytes.toBytes("info"), Bytes.toBytes("personType"), CompareFilter.CompareOp.EQUAL, new BinaryComparator(Bytes.toBytes("良民")));
//SingleColumnValueFilter:二进制比较器,只比较前缀是否相同,返回的是匹配到的整行,并非每一列
Filter filter0 = new SingleColumnValueFilter(Bytes.toBytes("info"), Bytes.toBytes("personType"), CompareFilter.CompareOp.EQUAL, new BinaryPrefixComparator(Bytes.toBytes("重点")));
//SingleColumnValueFilter:匹配正则表达式,返回匹配到的整行
Filter filter1 = new SingleColumnValueFilter(Bytes.toBytes("info"), Bytes.toBytes("personType"), CompareFilter.CompareOp.EQUAL, new RegexStringComparator(".*重点人员.*"));
//SingleColumnValueFilter:匹配是否包含子串,大小写不敏感,返回匹配到的整行
Filter filter2 = new SingleColumnValueFilter(Bytes.toBytes("info"), Bytes.toBytes("personType"), CompareFilter.CompareOp.EQUAL, new SubstringComparator("线索人员"));
//查询出匹配的行,但是过滤掉所匹配的列
Filter filter3 = new SingleColumnValueExcludeFilter(Bytes.toBytes("info"), Bytes.toBytes("personType"), CompareFilter.CompareOp.EQUAL, new SubstringComparator("线索人员"));
//RandomRowFilter:按照一定的几率来返回随机的结果
Filter filter4 = new RandomRowFilter((float) 0.5);
//RowFilter:删选出指定开头行健的所有匹配的行
Filter filter5 = new PrefixFilter(Bytes.toBytes("00"));
//ValueFilter:按照value全数据库搜索,返回的是所匹配值的某一列,并非某一行
Filter filter6 = new ValueFilter(CompareFilter.CompareOp.NOT_EQUAL, new BinaryComparator(Bytes.toBytes("23")));
//按family(列族)查找,取回所有符合条件的“family”
Filter filter7 = new FamilyFilter(CompareFilter.CompareOp.LESS_OR_EQUAL, new BinaryComparator(Bytes.toBytes("info")));
//KeyOnlyFilter:返回所有的行,但是值全是空
Filter filter8 = new KeyOnlyFilter();
//ColumnsPrefixFilter:按照列明的前缀来筛选单元格,返回所有行的指定某列
Filter filter9 = new ColumnPrefixFilter(Bytes.toBytes("ag"));
//FirsterKeyOnlyFilter:返回的结果集中只包含第一列的而数据,在找到每一行的第一列后就会停止扫描
Filter filter10 = new FirstKeyOnlyFilter();
//InclusiveStopFilter:返回截止到指定行的所有数据,包含最后一行(005)。使用startRow以及stopRow的时候是左闭右开
Filter filter11 = new InclusiveStopFilter(Bytes.toBytes("005"));
//cloumnCountGetFilter:返回每行最多返回多少列,在一行列数超过一定数量的时候,结束整个表的扫描
Filter filter12 = new ColumnCountGetFilter(6);
//SkipFilter:附加过滤器,如果发现一行中的某一列不符合条件,则整行就会被过滤
Filter filter13 = new SkipFilter(filter6);
//WhileMatchFilter:过滤数据,直到不符合条件,停止扫扫描,返回的是符合条件的每一列数据
Filter filter14 = new WhileMatchFilter(filter6);
//QualifierFilter:列名过滤,返回指定的每一列数据
Filter filter15 = new QualifierFilter(CompareFilter.CompareOp.EQUAL, new BinaryComparator(Bytes.toBytes("age")));
//MultipleColumnPrefixFilter:与ColumnsPrefixFilter不同的是可以指定多个列明的前缀
byte[][] prefixs = new byte[][]{Bytes.toBytes("ag"), Bytes.toBytes("na")};
Filter filter16 = new MultipleColumnPrefixFilter(prefixs);
//ColumnRangeFilter:可以进行高效的列名内部扫描,因为列名是已经按照字典顺序排好的,返回[minColumn,maxColumn]之间的数据
boolean minColumnlnclusive = true;
boolean maxColumnlnclusive = true;
Filter filter17 = new ColumnRangeFilter(Bytes.toBytes("name"), minColumnlnclusive, Bytes.toBytes("zjhm"), maxColumnlnclusive);
//DependentColumnFilter:尝试找到该列所在的每一行,并返回改行具有相同时间戳的全部键值对,返回的是具体的某一列,并非某一行
Filter filter18 = new DependentColumnFilter(Bytes.toBytes("info"), Bytes.toBytes("age"));
//RandomRowFilter:随机选择一行的过滤器,chance是一个浮点数
float chance = 0.6f;
Filter filter19 = new RandomRowFilter(chance);
//ColumnPaginationFilter:按列分页过滤器,针对列数量很多的情况使用
int limit = 3;
int columnOffset = 0;
Filter filter20 = new ColumnPaginationFilter(limit, columnOffset);
//综合过滤器使用
List<Filter> filters = new ArrayList<>();
filters.add(filter1);
filters.add(filter2);
FilterList fl = new FilterList(FilterList.Operator.MUST_PASS_ALL, filters); ((SingleColumnValueFilter) filter1).setFilterIfMissing(false);
scan.setFilter(filter20);
ResultScanner scanner = table.getScanner(scan);
for (Result r : scanner) {
for (Cell cell : r.rawCells()) {
System.out.println(
"Rowkey:" + Bytes.toString(r.getRow()) + "\t" +
"Family:Quilfifier " + Bytes.toString(CellUtil.cloneQualifier(cell)) + "\t" +
"value: " + Bytes.toString(CellUtil.cloneValue(cell))
);
}
}
scanner.close();
} /**
* 分页过滤器
* PageFilter:用于按行分页
*/
public void pageFilter(String tableName) throws IOException {
Table table = conn.getTable(TableName.valueOf(tableName));
long pageSize = 2;
int totalRowsCount = 0;
PageFilter pageFilter = new PageFilter(pageSize);
byte[] lastRow = null;
while (true) {
Scan scan = new Scan();
scan.setFilter(pageFilter);
if (lastRow != null) {
byte[] posfix = Bytes.toBytes("002");
byte[] startRow = Bytes.add(lastRow, posfix);
scan.setStartRow(startRow);
System.out.println("start row :" + Bytes.toString(startRow));
}
ResultScanner scanner = table.getScanner(scan);
int localRowsCount = 0;
for (Result result : scanner) {
System.out.println(localRowsCount++ + ":" + result);
totalRowsCount++;
lastRow = result.getRow();
}
scanner.close();
if (localRowsCount == 0) break;
}
System.out.println("total rows is :" + totalRowsCount);
}
}
3、自定义过滤器
--后面在补
HBase过滤器的使用的更多相关文章
- HBase学习——4.HBase过滤器
1.过滤器 基础API中的查询操作在面对大量数据的时候是非常苍白的,这里Hbase提供了高级的查询方法:Filter.Filter可以根据簇.列.版本等更多的条件来对数据进行过滤,基于Hbase本身提 ...
- Hadoop生态圈-Hbase过滤器(Filter)
Hadoop生态圈-Hbase过滤器(Filter) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任.
- HBase(七)Hbase过滤器
一.过滤器(Filter) 基础API中的查询操作在面对大量数据的时候是非常苍白的,这里Hbase提供了高级的查询方法:Filter.Filter可以根据簇.列.版本等更多的条件来对数据进行过滤,基于 ...
- Hbase过滤器
Hbase过滤器简介 HBase的基本API,包括增.删.改.查等,增.删都是相对简单的操作,与传统的RDBMS相比,这里的查询操作略显苍白,只能根据特性的行键进行查询(Get)或者根据行键的范围来查 ...
- HBase 学习之路(七)——HBase过滤器详解
一.HBase过滤器简介 Hbase提供了种类丰富的过滤器(filter)来提高数据处理的效率,用户可以通过内置或自定义的过滤器来对数据进行过滤,所有的过滤器都在服务端生效,即谓词下推(predica ...
- HBase 系列(七)——HBase 过滤器详解
一.HBase过滤器简介 Hbase 提供了种类丰富的过滤器(filter)来提高数据处理的效率,用户可以通过内置或自定义的过滤器来对数据进行过滤,所有的过滤器都在服务端生效,即谓词下推(predic ...
- 入门大数据---Hbase 过滤器详解
一.HBase过滤器简介 Hbase 提供了种类丰富的过滤器(filter)来提高数据处理的效率,用户可以通过内置或自定义的过滤器来对数据进行过滤,所有的过滤器都在服务端生效,即谓词下推(predic ...
- Hbase过滤器Filter的使用心得(爬坑经验)
Hbase 的过滤器是个好东西.. 给这种非关系型数据库本来不能复杂查询的情况得到了很好的扩展..提供了很多的帮助.. 但是Filter的种类何其之多..让人眼花缭乱.. 譬如..分页类型的PageF ...
- hbase 过滤器 rowfilter
HBase为筛选数据提供了一组过滤器,通过这个过滤器可以在HBase中的数据的多个维度(行,列,数据版本)上进行对数据的筛选操作,也就是说过滤器最终能够筛选的数据能够细化到具体的一个存储单元格上(由行 ...
随机推荐
- Codeforces 670 - A/B/C/D/E/F - (Done)
链接:https://codeforces.com/contest/670 A - Holidays - [水] AC代码: #include<bits/stdc++.h> using n ...
- Codeforces 483 - A/B/C/D/E - (Done)
题目链接:http://codeforces.com/contest/483 A - Counterexample - [简单构造题] Your friend has recently learned ...
- Feign 客户端源码解析
Feign的使用非常简单,增加如下配置之后,便可以使用Feign进行调用.非常简单是不是.主要的工作由Feign框架完成.业务代码只提供了一个Interface, 然后由Feign动态生成代理类来实现 ...
- [ovs] 编写openflow流表的文档指引
首先,openflow流表都是使用ovs-ofctl命令进行添加的. 1. 看 ovs-ofctl 的man手册 man ovs-ofctl 或者,这个地方也有:http://www.openvswi ...
- Spring事物管理--相关要点及配置事物管理器
事务的四大特征 1.原子性:一个事务中所有对数据库的操作是一个不可分割的操作序列,要么全做要么全不做 2.一致性:数据不会因为事务的执行而遭到破坏 3.隔离性:一个事物的执行,不受其他事务的干扰,即并 ...
- jQuery 学习笔记(5)(事件绑定与解绑、事件冒泡与事件默认行为、事件的自动触发、自定义事件、事件命名空间、事件委托、移入移出事件)
1.事件绑定: .eventName(fn) //编码效率略高,但部分事件jQuery没有实现 .on(eventName, fn) //编码效率略低,所有事件均可以添加 注意点:可以同时添加多个相同 ...
- Spring MVC原理及配置详解
Spring MVC概述: Spring MVC是Spring提供的一个强大而灵活的web框架.借助于注解,Spring MVC提供了几乎是POJO的开发模式,使得控制器的开发和测试更加简单.这些控制 ...
- mongodb 安装遇到问题:the domain,user name and/or password are incorrect.remember to use"." for the domain if the account is on the local machine
安装mongoDB遇到如下问题:the domain,user name and/or password are incorrect.remember to use"." for ...
- 微信小程序一些demo链接地址
校园小情书小程序前端+后端源码 https://www.douban.com/group/topic/116974400/ 小程序源码疯狂猜成语小程序源码UI美观 https://www.douban ...
- 第十节 JS运动中级
链式运动框架. 回调函数 运动停止时,执行函数 运动停止时,开始下一次运动 <!DOCTYPE html> <html lang="en"> <hea ...