java自定义 filter,HBase自定义Filter

必需要提前说明下:不建议使用自定义的Filter。所有的Filter都是在服务端生效:就是说需要将自定义的Filter封装为jar,上传到HBase的类路径下,并重启HBase使之生效。对于生产环境的HBase来说,重启通常是不能接受的。

Filter的设置是在客户端完成的,而Filter的逻辑是在HBase的服务端完成的,中间需要一次序列化。我试过几种序列化方案,不过protobuffer以外的其他几种效果不算好。HBase自带的Filter也是用protobuffer进行的序列化,因此使用protobuffer还可以少传几个包。

需要提前说明的已经说完了,开始进入正题。这次从一个案例开始说起:在HBase中存储着用户行为记录,行键设计为“uid(6位)+etime(时间戳/1000)+tid(7位)+顺序号(8位)”。其中uid为用户ID、etime为事件时间、tid为行为标签。目标是检索出某个用户在指定时间范围内的几种行为数据。

针对这个案例我们自定义一个CustomRowKeyFilter,并将一个用户ID、事件起止时间以及多个行为ID作为CustomRowKeyFilter的成员变量。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

packagecom.zhyea.dev.hbase.filter;

importorg.apache.hadoop.hbase.Cell;

importorg.apache.hadoop.hbase.filter.FilterBase;

importorg.apache.hadoop.hbase.util.Bytes;

importjava.io.IOException;

publicclassCustomRowKeyFilterextendsFilterBase{

privatelongpid;

privatelongeventTime;

privateStringtids;

privatebooleanfilterOutRow=false;

publicCustomRowKeyFilter(long_pid,long_eventTime,String_tids){

this.pid=_pid;

this.eventTime=_eventTime;

this.tids=_tids;

}

@Override

publicbooleanfilterRowKey(byte[]data,intoffset,intlength){

StringrowKey=Bytes.toString(data,offset,length);

this.filterOutRow=check(rowKey);

returnthis.filterOutRow;

}

publicReturnCodefilterKeyValue(Cellv)throwsIOException{

if(this.filterOutRow){

returnReturnCode.NEXT_ROW;

}

returnReturnCode.INCLUDE;

}

privatebooleancheck(StringrowKey){

try{

if(rowKey.length()<7){

returntrue;

}

long_pid=Long.valueOf(rowKey.substring(0,6));

long_eTime=Long.valueOf(rowKey.substring(6,16));

long_tid=Long.valueOf(rowKey.substring(16,23));

if(this.pid!=_pid){

returntrue;

}

if(this.eventTime>_eTime){

returntrue;

}

if(!this.tids.contains(_tid+"")){

returntrue;

}

}catch(Exceptione){

returntrue;

}

returnfalse;

}

}

代码中继承了FilterBase类,可以减少一些结构性的代码工作。至于Filter是如何工作的,在网上找到的这张图应该描述得很清楚了:

c594276a7ad9c3b2c5e661b87b4abd92.png

前面的代码只是实现了Filter的处理逻辑。要想使用这个Filter还需要做一些序列化处理。如前面所说序列化方案选择的是protobuffer,这里需要先定义一个描述文件CustomRowKeyFilterProto.proto,内容如下:

1

2

3

4

5

6

7

8

9

10

packagefilter;

optionjava_package="com.zhyea.dev.hbase.filter.proto";

optionjava_outer_classname="CustomRowKeyFilterProto";

messageCustomRowKeyFilter{

requiredint64pid=1;

requiredint64eventTime=2;

requiredstringtids=3;

}

定义完成后,执行protoc命令:

1

protoc-I=./--java_out=../src/main/javaCustomRowKeyFilterProto.proto

其中“-I”指定了proto描述文件的父目录, “—java_out”指定了java类的类路径,具体请根据自己的情况进行设置。执行命令后会在包com.zhyea.dev.hbase.filter.proto下生成序列化工具类CustomRowKeyFilterProto.java。

接下来在CustomRowKeyFilter中重写Filter类的toByteArray()方法和parseFrom()方法:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

publicbyte[]toByteArray()throwsIOException{

CustomRowKeyFilterProto.CustomRowKeyFilter.Builderbuilder=CustomRowKeyFilterProto.CustomRowKeyFilter.newBuilder();

builder.setPid(this.pid);

builder.setEventTime(this.eventTime);

builder.setCids(this.tids);

returnbuilder.build().toByteArray();

}

publicstaticFilterparseFrom(finalbyte[]pbBytes)throwsDeserializationException{

CustomRowKeyFilterProto.CustomRowKeyFilterproto;

try{

proto=CustomRowKeyFilterProto.CustomRowKeyFilter.parseFrom(pbBytes);

}catch(InvalidProtocolBufferExceptione){

thrownewDeserializationException(e);

}

long_pid=proto.getPid();

long_eventTime=proto.getEventTime();

String_tids=proto.getCids();

returnnewCustomRowKeyFilter(_pid,_eventTime,_tids);

}

这样自定义Filter就完成了。剩下的事情就是将之打包并上传到HBase(每个RegionServer)的类路径下。然后就可以在程序中使用了。

现在再仔细想想这个程序,是否一定需要一个自定义Filter呢!我们已经将查询需要的所有元素都定义在行键里了。那么可以使用“uid+起始时间”作为startRow,“uid+结束时间”作为stopRow完成时间范围的匹配,使用RegexStringComparator来处理tid的匹配,这样直接使用HBase提供的RowFilter就能解决问题了。唯一需要注意的事情就是在设计表时多花些心思在行键上罢了。

就是这样。

参考文档

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/572762.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Mybatis学习总结(二)——Mapper代理开发

一、概要 1、原始DAO开发中存在的问题:&#xff08;1&#xff09;DAO实现方法体中存在很多过程性代码。&#xff08;2&#xff09;调用SqlSession的方法(select/insert/update)需要指定Statement的id&#xff0c;存在硬编码&#xff0c;不利于代码维护。 2、Mapper动态代理方法…

mac wordpress php7,Mac 下基于 wordpress 搭建个人博客系统

一、前言这里说的是自己从 wordpress 源码开始搭建一个个人博客系统。当然&#xff0c;很多云端已经直接提供了在线安装的方式&#xff0c;这个就不在本文的讨论范围之内了。二、关于 wordpresswordpress是一款个人博客系统&#xff0c;并逐步演化成一款内容管理系统软件&#…

TypeError: db.addUser is not a function : @(shell):1:1 ——mongoDB创建新用户名密码的方法...

不多说&#xff0c;旧版本使用 db.addUser("root","root") 新版本使用这句会出现这个错误提示 TypeError: db.addUser is not a function : (shell):1:1 新版本用的是 db.createUser({user: "test",pwd: "test",roles: [ { role: &quo…

php多人访问抽奖倒计时一致,Javascript和PHP倒计时器为每个人显示相同的计时器...

我有生成倒计时器所需的脚本,该计时器有一个启动和恢复按钮.我试图做的是在一个控制另一页上的计时器的页面上有启动,停止和重置按钮.因此,如果用户X访问page.html,他们将看到一个0的计时器.Admin X访问admin.html,他们看到计时器为0,但他们也有一个启动,停止和重置按钮.当管理…

将list中的元素按照属性分类成树状的map

技术交流群&#xff1a; 233513714public LinkedHashMap<String, List<TPhoneModel>> queryPhoneList(List<TPhoneModel> list) {LinkedHashMap<String, List<TPhoneModel>> map new LinkedHashMap<>();for (TPhoneModel li : list) {  …

java能传地址吗,详解java的值传递、地址传递、引用传递

一直来觉得对值传递和地址传递了解的很清楚&#xff0c;刚才在开源中国上看到一篇帖子介绍了java中的值传递和地址传递&#xff0c;看完后感受颇深。下边总结下以便更容易理解。按照以前的理解&#xff0c;java中基本数据类型是值传递&#xff0c;对象是地址(引用)传递。给大家…

SpringMVC实现PUT请求上传文件

在JQuery中&#xff0c;我们可以进行REST ful中delete和put的请求&#xff0c;但是在java EE标准中&#xff0c;默认只有在POST请求的时候&#xff0c;servlet 才会通过getparameter()方法取得请求体中的相应的请求参数的数据。而PUT&#xff0c;delete请求的请求体中数据则默认…

jQuery多库共存问题解决方法

一、问题概述: 1、随着jQuery的流行,采用jQuery和$符为命名空间的js库越来越多,当然jQuery的$符也是参照的Prototype库的,所以当多个库同时以$符或者jQuery为命名空间时,那么此时,就会产生冲突。 2、由于jQuery的更新速度过快,所以插件更不上,导致不同版本的jQuery对插件支持的…

java开发技术有什么意义,零基础学Java开发技术有哪些优势和好处?

零基础学Java开发技术有哪些优势和好处&#xff1f;Java开发技术有下列优势&#xff1a;Java编程语言简单、面向对象集中于对象及其接口、分布式处理TCP/IP协议、鲁棒性、安全性、体系结构中立性、可移植性、解释执行、高性能、多线程以及动态性等。零基础学Java开发技术的优势…

[TC SRM 685 div1 lev1] MultiplicationTable2

转载&#xff1a; https://www.linkedin.com/pulse/topcoder-685-multiplicationtable2-yingwu-zhu Note: 生成封闭集合方式。 ProblemFox Ciel is creating a new binary operation.The operation will be denoted $ and it will be defined on the finite set S {0, 1, 2, .…

php树菜单转化为一维菜单,php树型菜单 - iturtle的个人空间 - OSCHINA - 中文开源技术交流社区...

通过处理array,添加level,is_leaf属性实现 树型菜单公共类通过处理array,添加level,is_leaf属性实现 树型菜单/*树形分类添加节点属性*$data, 要处理的节点数组*$pid,父类ID*$prefix, 字段前缀 如chh_pid*$tree array()**/function getTree($data, $pid,$prefix,$tree) {for…

C#-WebForm-★★★JQuery知识——基础知识、选择器、事件★★★

JQuery 与 JS 之间的转换 将JQuery转换为JS —— get(0)  例如&#xff1a;alert( $("#d1").get(0).offsetwidth ); 将JS 转换为JQuery —— $(" ")  例如&#xff1a;$("#d1").click(function(){}); 1、什么是JQuery&#xff1f;   它就是…

Java编号姓名元宝数密码,通过my Eclipse控制台向数据库(SQL2008)中查找、删除、插入信息...

通过my Eclipse控制台向数据库(SQL2008)中查找、删除、插入信息如果编译程序有什么错误还望大家多多指正代码执行所需数据库、架包及java源文件已上传至文件 文件名 SQl_JDBC.zip用my Eclipse控制台操作数据库之前(SQL 2008)之前 应先引入一个架包(sqljdbc4.jar) 在架包导入之后…

matlab 空矩阵耗时,性能 – 更快的方式通过空矩阵乘法初始化数组? (Matlab)

这很奇怪&#xff0c;我看到f更快&#xff0c;而g比你看到的慢。但是他们对我来说都是一样的。也许不同版本的MATLAB&#xff1f;>> g () zeros(1000, 0) * zeros(0, 1000);>> f () zeros(1000)f ()zeros(1000)>> timeit(f)ans 8.5019e-04>> timeit(…

事件对象及其属性

$(function(){$(input).bind(click,function(e){alert(e); //获取对象//event对象的属性alert(e.type);alert(e.target);alert(e.currentTarget);//得到监听元素的DOM&#xff0c;target是点的那个的DOM});$(input).bind(mouseover,function(e){alert(e.relatedTarget);});$(in…

百度网盘php文件怎么打开,如何通过网页版百度网盘下载大文件

最近老张需要在百度网盘下载一个较大的文件&#xff0c;结果他要我必须下载客户端才行&#xff0c;此背景下&#xff0c;在网站找了各种办法&#xff0c;什么模拟手机&#xff0c;F12查看下载链接都不行&#xff0c;最后找到了可行的办法。步骤如下&#xff1a;一&#xff1a;如…

matlab对信号加噪代码,Matlab给信号加噪声

在信号处理中经常需要把噪声叠加到信号上去&#xff0c;在叠加噪声时往往需要满足一定的信噪比&#xff0c;这样产生二个问题&#xff0c;其一噪声是否按指定的信噪比叠加&#xff0c;其二怎么样检验带噪信号中信噪比满足指定的信噪比。在MATLAB中可以用randn产生均值为0方差为…

洛谷 1057——台阶问题(递推与递归二分)

题目描述 有N级的台阶&#xff0c;你一开始在底部&#xff0c;每次可以向上迈最多K级台阶&#xff08;最少1级&#xff09;&#xff0c;问到达第N级台阶有多少种不同方式。 输入输出格式 输入格式&#xff1a; 输入文件的仅包含两个正整数N&#xff0c;K。 输出格式&#xff1…

在matlab中ungetfile后,11条Matlab实用小技巧

2011-02-25 15:361.在用循环画很多图时&#xff0c;为了减少对内存的占用&#xff0c;可以设置图像不显示&#xff0c;直接保存起来。其实也很简单&#xff0c;就是在plot等语句前加上一句&#xff1a;figure(visible,off)。这样画图时就不显示了&#xff01;2.记得很久以前就有…

ngix 创建新的网站

1. 进入ngix 的目录的conf 目录 的 vhosts 2. 复制一份新的v2.edc.com.conf 3. server_name : v2.edc.com root : /ali/...../目录 4. 重启nginx 服务 │ /etc/init.d/nginx start|stop|restart │ │ …