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)全局方 ...
随机推荐
- 部署jenkins问题
总结:配置的url,jenkins部署的ip必须有开放,否则发布会超时失败
- Python的with语句(文件打开方式)
Python文件打开方式(with语句) python编程中对于文件的打开方式主要有以下两种: 1.利用直接性的open("","")函数:(举例说明) try ...
- [C++]值传递和引用传递
概念 在定义函数时函数括号中的变量名成为形式参数,简称形参或虚拟参数: 在主调函数中调用一个函数时,该函数括号中的参数名称为实际参数,简称实参,实参可以是常量.变量或表达式. 注意: C语言中实参和形 ...
- mac 下删除行末^M 字符
在vi 打开文件模式下进行字符替换 :%s/^M/\r/g //这里的^M是同时按ctrl+v+m获得的,否则会显示找不到^M
- yocto-sumo源码解析(一): oe-init-build-env
oe-init-build-env是yocto构建环境运行的第一个脚本,通过运行下面的命令: . oe-init-build-env build-arm64 即可对yocto项目进行构建,顾名思义,该 ...
- "api-ms-win-crt-runtime-l1-1-0.dll 丢失"怎么办?详细解决步骤
api-ms-win-crt-runtime-l1-1-0.dll 丢失 电脑找不到api-ms-win-crt-runtime-l1-1-0.dll文件解决方法: 问题描述: 1.开机提示" ...
- cmd下执行mysql
1. mysql -uroot -p1234; 2. show databases; 3. use testnode; 4. 创建数据库表 CREATE DATABASE `node` DEFA ...
- 微信JS-SDK实现上传图片功能
最近在项目开发中,有一个在微信WEB项目中上传图片的需求,一开始使用了传统的<input type="file">的方式去实现,但是后面发现在使用这种传统模式时会由于手 ...
- swoole中退出、异常与错误的处理笔记
关于PHP这方面的知识 可以看 https://www.cnblogs.com/zyf-zhaoyafei/p/6928149.html 进行补课 然后下面记录一下使用swoole的时候需要注意的地方 ...
- nginx keepalived 高可用方案(转)
转自: https://www.cnblogs.com/leeSmall/p/9356535.html 一.Nginx Rewrite 规则 1. Nginx rewrite规则 Rewrite规则含 ...