hbase 自定义过滤器
1、首先生成自定义过滤器,生成jar包,然后拷贝到服务器hbase目录的lib下。
1.1 自定义过滤器CustomFilter
import com.google.protobuf.InvalidProtocolBufferException;
import org.apache.hadoop.hbase.Cell;
import org.apache.hadoop.hbase.CellUtil;
import org.apache.hadoop.hbase.exceptions.DeserializationException;
import org.apache.hadoop.hbase.filter.Filter;
import org.apache.hadoop.hbase.filter.FilterBase;
import org.apache.hadoop.hbase.util.ByteStringer; import java.io.IOException; /**
* @Author: xu.dm
* @Date: 2019/4/14 12:16
* @Description: 自定义过滤器,选择列值匹配的行数据
*/
public class CustomFilter extends FilterBase {
private byte[] value = null;
private boolean filterRow = true; public CustomFilter() {
super();
} public CustomFilter(byte[] value) {
this.value = value;
} @Override
public void reset() throws IOException {
this.filterRow = true;
} @Override
public boolean filterRow() throws IOException {
return this.filterRow;
} //匹配的数据不过滤
@Override
public ReturnCode filterCell(Cell c) throws IOException {
if(CellUtil.matchingValue(c,value))
filterRow = false;
return ReturnCode.INCLUDE;
} /**
* protobuf生成MyFilterProtos
*/
@Override
public byte[] toByteArray() throws IOException {
MyFilterProtos.CustomFilter.Builder builder = MyFilterProtos.CustomFilter.newBuilder();
if(value!=null)
builder.setValue(ByteStringer.wrap(value)); return builder.build().toByteArray();
} public static Filter parseFrom(final byte[] pbBytes)
throws DeserializationException {
MyFilterProtos.CustomFilter proto;
try {
proto = MyFilterProtos.CustomFilter.parseFrom(pbBytes);
} catch (InvalidProtocolBufferException e) {
throw new DeserializationException(e);
}
return new CustomFilter(proto.getValue().toByteArray());
}
}
1.2 MyFilterProtos是通过protobuf生成的,这里需要注意hbase使用的是protobuf2.5.0版本,不要使用高于2.5.0版本的protobuf,不然hbase会报找不到类的错误。
proto文件
syntax = "proto2"; option java_package = "";
option java_outer_classname = "MyFilterProtos";
option java_generic_services = true;
option java_generate_equals_and_hash = true;
option optimize_for = SPEED; message CustomFilter {
required bytes value = 1;
}
1.3 编辑成jar包,发布到hbase的lib目录,hbase需要重启

[root@bigdata-senior01 lib]# ls $HBASE_HOME/lib/Custom*.*
/opt/hbase-2.0.4/lib/CustomFilter.jar
2、使用自定义过滤
2.1 程序中引入刚才发布的jar包

2.2 使用自定义过滤器过滤数据
//使用自定义过滤器,只显示匹配列值的行
private static void customFilterData() throws IOException{
Table table = helper.getConnection().getTable(TableName.valueOf("testtable")); List<Filter> filters = new ArrayList<Filter>(); Filter filter1 = new CustomFilter(Bytes.toBytes("user30"));
filters.add(filter1); Filter filter2 = new CustomFilter(Bytes.toBytes("user20"));
filters.add(filter2); Filter filter3 = new CustomFilter(Bytes.toBytes("user90"));
filters.add(filter3); FilterList filterList = new FilterList(
FilterList.Operator.MUST_PASS_ONE, filters); Scan scan = new Scan();
scan.setFilter(filterList);
ResultScanner scanner = table.getScanner(scan);
for(Result result:scanner){
helper.dumpResult(result);
} scanner.close();
table.close();
}
}
输出结果:
Cell: rowKey20/ex:addr/1555078771906/Put/vlen=8/seqid=0, Value: street20
Cell: rowKey20/info:username/1555078771906/Put/vlen=6/seqid=0, Value: user20
Cell: rowKey20/memo:detail/1555078771906/Put/vlen=8/seqid=0, Value: remark20
Cell: rowKey30/ex:addr/1555078771906/Put/vlen=8/seqid=0, Value: street30
Cell: rowKey30/info:username/1555078771906/Put/vlen=6/seqid=0, Value: user30
Cell: rowKey30/memo:detail/1555078771906/Put/vlen=8/seqid=0, Value: remark30
Cell: rowKey90/ex:addr/1555078771906/Put/vlen=8/seqid=0, Value: street90
Cell: rowKey90/info:username/1555078771906/Put/vlen=6/seqid=0, Value: user90
Cell: rowKey90/memo:detail/1555078771906/Put/vlen=8/seqid=0, Value: remark90
hbase 自定义过滤器的更多相关文章
- HBase - Filter - 过滤器的介绍以及使用
1 过滤器HBase 的基本 API,包括增.删.改.查等.增.删都是相对简单的操作,与传统的 RDBMS 相比,这里的查询操作略显苍白,只能根据特性的行键进行查询(Get)或者根据行键的范围来查询( ...
- 实现MVC自定义过滤器,自定义Area过滤器,自定义Controller,Action甚至是ViewData过滤器
MVC开发中几种以AOP方式实现的Filters是非常好用的,默认情况下,我们通过App_Start中的FilterConfig来实现的过滤器注册是全局的,也就是整个应用程序都会使用的,针对单独的Fi ...
- lucene自定义过滤器
先介绍下查询与过滤的区别和联系,其实查询(各种Query)和过滤(各种Filter)之间非常相似,可以这样说只要用Query能完成的事,用过滤也都可以完成,它们之间可以相互转换,最大的区别就是使用过滤 ...
- asp.net MVC之 自定义过滤器(Filter) - shuaixf
一.系统过滤器使用说明 1.OutputCache过滤器 OutputCache过滤器用于缓存你查询结果,这样可以提高用户体验,也可以减少查询次数.它有以下属性: Duration :缓存的时间, 以 ...
- angular之自定义过滤器的使用
自定义过滤器需要使用filter函数,格式如下: filter("filterName',function(){ return function(target,args){ .... } } ...
- 第六节:Vue过滤器的用法和自定义过滤器
1.过滤器的用法,用 '|' 分割表达式和过滤器. 例如:{{ msg | filter}} {{msg | filter(a)}} a就标识filter的一个参数. 用两个过滤器:{{ ...
- .net中自定义过滤器对Response内容进行处理
原文:http://www.cnblogs.com/zgqys1980/archive/2008/09/02/1281895.html 代码DEMO:http://files.cnblogs.com/ ...
- asp.net MVC之 自定义过滤器(Filter)
一.系统过滤器使用说明 1.OutputCache过滤器 OutputCache过滤器用于缓存你查询结果,这样可以提高用户体验,也可以减少查询次数.它有以下属性: Duration:缓存的时间,以秒为 ...
- Vue自定义过滤器
gitHub地址: https://github.com/lily1010/vue_learn/tree/master/lesson05 一 自定义过滤器(注册在Vue全局) 注意事项: (1)全局方 ...
随机推荐
- JMeter转制LoadRunner HTTP协议脚本的小技巧
对于Http协议的请求,除了手工编写脚本外,JMeter还提供了录制浏览器操作的功能,甚是方便.那如果手头有一堆HTTP协议的LoadRunner脚本,能不能比较快速的转制成JMeter脚本呢?其实也 ...
- 从零开始的Python学习Episode 22——多线程
多线程 线程 线程是操作系统能够进行运算调度的最小单位.它被包含在进程之中,是进程中的实际运作单位.一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务. ...
- 为什么HashMap桶(链表)的长度超过8会转换成红黑树?
百度了一下,感觉能说清楚的并不多,所以在此记录一下. 首先说一说转换为红黑树的必要性: 红黑树的插入.删除和遍历的最坏时间复杂度都是log(n), 因此,意外的情况或者恶意使用下导致hashCode( ...
- Visionpro介绍和下载安装视频教程
------------------------Halcon,Visionpro高清视频教程,点击下载视频--------------------------
- 最新!2016中国城市GDP排名出炉
2017年1月20日,国家统计局公布:2016年中国国内生产总值GDP达744127亿元,同比增长6.7%,城市GDP方面:截至1月20日,全国大部分城市的去年经济运行数据已经公布,根据信息汇总,20 ...
- Python20 - Day09
python并发编程之多线程理论 1.什么是线程? 进程只是用来把资源集中到一起(进程是一个资源单位,或者说资源集合),而线程才是cpu上的执行单位. 多线程(多个控制线程)的概念是,在一个进程中存在 ...
- linux命令系列 stat & touch
1. stat - display file or file system status stat命令主要用于显示文件或文件系统的状态,详细信息 事实上,stat命令显示的是文件的I节点信息.Linu ...
- 插件使用-HighChart
一.介绍 让数据可视化更简单,兼容 IE6+.完美支持移动端.图表类型丰富.方便快捷的 HTML5 交互性图表库. 官网(英):https://www.highcharts.com/download ...
- hive创建临时函数
add jar /home/hjl/sunwg/Lower.jar; create temporary function my_lower as ‘com.example.hive.udf.Lower ...
- 第一个scrim任务分布
一.项目经理:郭健豪 二.scrim分工 杨广鑫.郭健豪:制作第一个精选页面布局,和代码实现.如:实现图书推荐布局中图书的排布,搜索框代码的实现,消息提示的跳转 李明.郑涛:实现第一个精选页面数据库的 ...