您的位置:首页 > 编程语言 > Java开发

[hbase]使用HBase的Java API查询HBase(2)

2015-12-18 16:28 344 查看
HBase数据库,数据量 613,428,000条



HBase表结构,为一表,一列族,一列,一值





表名dnslog,columnfamily为info,列为c1,value.

rowkey组成:账号+”_”+时间

大牛笔记


需求:

获取zywy这个账号,在2014-11-11 10:10:10秒 到 2014-12-11 10:10:10秒之间,最后发送的那条数据的内容。


先看代码:


结果:

执行速度上,在一秒内完成。如果要返回多个结果,需要将keyvalue的for循环,放到result的for循环内(执行时间,10秒左右)。

在速度上,还是可以接受的。这么快的原因主要在rowkey设计方面,设计的合理性会影响查询时速度。


解释:

ResultScanner,扫描表,获取最终结果。

下面就是定义一些filter的使用。

PrefixFilter,前缀的筛选,也就是筛选rowkey中,最前面字符为zywy的记录。

RowFilter,也是根据rowkey筛选定义记录的范围 minRowKey 和 maxRowKey之间的数据。

PageFilter,这里的pageFilter没用到,这个也是很好的一个类。分页时使用。

scan.setMaxVersions();选择最新版本的数据

scan.setStartRow(minRowKey.getBytes()) 和scan.setStopRow(maxRowKey.getBytes()) 就是设置rowkey的范围了。

Result lastR = null; 定义一个变量,用来存储最后一条记录。

HBase的RowKey是自动排好序的。rowkey是按照ascii码进行排序的。所以最先扫描到的,是最老的数据。但是需求要求返回最新的一条记录。

这里如果向MySql等关系型数据库那样,来一个order by rowkey desc 换个顺序就爽了。可惜HBase没有。官网说明

我所使用的HBase版本为hbase-0.94.18.tar.gz算是比较老的版本了。

由于没有排序的功能,所以只能是从前往后循环一遍,将最后的变量,存到lastR中。

如果要是支持orderby操作,那么我可以加上pagefilter

这样直接返回的就是最新的一条。

其实,在hbase-0.98+就支持了这个顺序反转的功能,通过添加如下代码,就可以实现了。官网说明

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: