在用java 对hbase多条件组合查询过程中遇到的坎坷

        最近公司的数据部门提出了要做大数据分析的需求,大数据方确定数据储存在hbase中,java工程师进行调用展示。我作为一个java工程师,觉得这很easy,不就是展示一个非关系型数据库的数据吗?当时我还不了解hbase,觉得不会很困难,然而在接下来的工作中,我尝到了苦头。首先我在熟悉hbase的时候,由于过度的藐视,导致我在后面的编码中出现了很多大的偏差,比如:再开始学之前,知道rowkey是唯一的,也就意味着下面的数据只有一个,其实我错了,rowkey顾明思议是唯一了,但基于列的,它下面会有很对的数据,虽然,在学习一项新技术之前,在战略上藐视,但是你战术上一定要重视。下面,对于hbase的架构以及原理,网上很多,我也不是很透彻,就简单的吧我自己做的一些需求的代码贴出来和大家分享一下。

首先我是基于hbase的官方api进行查询的。在整合spring和hbase的是时候,有想过spring是不是已经做了封装的框架,结果查询后还真有:HbaseTemplate.我于是就想用这个,但是在网上查询好多资料,对于具体的一些查询的资料很少,加上我英语不好,很难看懂官方api,于是就选择了hbase官方的api。在整合的过程中,会遇到jar的冲突,也是解决了半天,首先是gauva的冲突,把带有的全部去掉只留了hbase-client里面的,还是有错

Exception in thread "main" java.lang.IllegalAccessError: tried to access method com.google.common.base.Stopwatch.<init>()V 
from class org.apache.hadoop.hbase.zookeeper.MetaTableLocator

解决是版hbase的版本从1.2.4换成了 0.98.5-hadoop2,还有错是缺少jar,添加了两个

<dependency>
			<groupId>xerces</groupId>
			<artifactId>xercesImpl</artifactId>
			<version>2.11.0</version>
		</dependency>
		<dependency>
			<groupId>xml-apis</groupId>
			<artifactId>xml-apis</artifactId>
			<version>1.4.01</version>
		</dependency>
总算跑通了。下面介绍一下业务需求的场景。首先, 我们的rowkey是用户的id,value是一个json格式的对象。对于大数据量的查询,我们并没有加入一些收缩引擎做值的索引与rowkey进行关联(可能需要后期优化会添加solrj)。

     前端需要查询有几个条件,我是基于Scan 添加Filterlist进行过滤的,在实例化Filterlist时,

FilterList filterse = new FilterList(FilterList.Operator.MUST_PASS_ALL,filters);

我构造了一了List<Fileter>集合,吧所有的filter都添加进来

        List<Filter> filters = new ArrayList<Filter>();

     首先,基于rowkey的代码:

RowFilter userid = new RowFilter(CompareOp.EQUAL,new BinaryComparator(Bytes.toBytes(param.get("userid").toString())));
    基于
Qualifier的,因为我们的列是时间,我做时间区间查询的:

     

       QualifierFilter dateStart = new QualifierFilter(CompareOp.GREATER_OR_EQUAL,new BinaryComparator(Bytes.toBytes(param.get("dateStart").toString())));
        	
       filters.add(dateStart);
        	 
       QualifierFilter dateEnd = new QualifierFilter(CompareOp.LESS,new BinaryComparator(Bytes.toBytes(param.get("dateEnd").toString())));
         	
       filters.add(dateEnd);

     基于值的查询用到了 ValueFilter,如果有多个可以添加多个(对于海量来说这种做法肯定是不行的)

       ValueFilter guid = new ValueFilter(CompareOp.EQUAL,new RegexStringComparator(param.get("guid").toString()));
       filters.add(guid);
      对于分页,我是基于内存的,我吧查询条件作为健,做了一个缓存系统,分页就是从list取对应的数据。缓存会定时的清空对应的key。而默认我是展示10条数据,用到了PageFilter查出最新的20条数据。

      对于hbase理解的有待加强,如果有说的不对的地方,欢迎大家指正




  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值