设为首页 加入收藏

TOP

在用java 对hbase多条件组合查询过程中遇到的坎坷
2018-11-30 09:42:54 】 浏览:74
Tags:在用 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理解的有待加强,如果有说的不对的地方,欢迎大家指正




】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇HBase shell scan命令中filter的.. 下一篇HBase无法停止时的做法

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目