HBase条件查询(多条件查询)

Author:Pirate Leohtml

myBlog: http://blog.csdn.net/pirateleo/apache

myEmail: codeevoship@gmail.comapi

转载请注明出处,谢谢。oop

文中可能涉及到的API:post

Hadoop/HDFS:http://hadoop.apache.org/common/docs/current/api/性能

HBase: http://hbase.apache.org/apidocs/index.html?overview-summary.htmlspa

Begin!.net

HBase的查询实现只提供两种方式:设计

一、按指定RowKey获取惟一一条记录,get方法(org.apache.hadoop.hbase.client.Getcode

二、按指定的条件获取一批记录,scan方法(org.apache.hadoop.hbase.client.Scan


实现条件查询功能使用的就是scan方式,scan在使用时有如下几点值得注意:

一、scan能够经过setCaching与setBatch方法提升速度(以空间换时间);

二、scan能够经过setStartRow与setEndRow来限定范围。范围越小,性能越高。

经过巧妙的RowKey设计使咱们批量获取记录集合中的元素挨在一块儿(应该在同一个Region下),能够在遍历结果时得到很好的性能。

三、scan能够经过setFilter方法添加过滤器,这也是分页、多条件查询的基础。


下面举个形象的例子:

咱们在表中存储的是文件信息,每一个文件有5个属性:文件id(long,全局惟一)、建立时间(long)、文件名(String)、分类名(String)、全部者(User)。

咱们能够输入的查询条件:文件建立时间区间(好比从20120901到20120914期间建立的文件),文件名(“中国好声音”),分类(“综艺”),全部者(“浙江卫视”)。

假设当前咱们一共有以下文件:

内容列表
ID CreateTime Name Category UserID
1 20120902 中国好声音第1期 综艺 1
2 20120904 中国好声音第2期 综艺 1
3 20120906 中国好声音外卡赛 综艺 1
4 20120908 中国好声音第3期 综艺 1
5 20120910 中国好声音第4期 综艺 1
6 20120912 中国好声音选手采访 综艺花絮 2
7 20120914 中国好声音第5期 综艺 1
8 20120916 中国好声音录制花絮 综艺花絮 2
9 20120918 张玮独家专访 花絮 3
10 20120920 加多宝凉茶广告 综艺广告 4


这里UserID应该对应另外一张User表,暂不列出。咱们只需知道UserID的含义:

1表明 浙江卫视; 2表明 好声音剧组; 3表明 XX微博; 4表明 赞助商。
调用查询接口的时候将上述5个条件同时输入find(20120901,20121001,"中国好声音","综艺","浙江卫视")。

此时咱们应该获得记录应该有第一、二、三、四、五、7条。第6条因为不属于“浙江卫视”应该不被选中。

咱们在设计RowKey时能够这样作:采用UserID + CreateTime + FileID组成rowKey,这样既能知足多条件查询,又能有很快的查询速度。

须要注意如下几点:

一、每条记录的RowKey,每一个字段都须要填充到相同长度。假如预期咱们最多有10万量级的用户,则userID应该统一填充至6位,如000001,000002...

二、结尾添加全局惟一的FileID的用意也是使每一个文件对应的记录全局惟一。避免当UserID与CreateTime相同时的两个不一样文件记录相互覆盖。

按照这种RowKey存储上述文件记录,在HBase表中是下面的结构:

rowKey(userID 6 + time 8 + fileID 6)     name    category ....

00000120120902000001

00000120120904000002

00000120120906000003

00000120120908000004

00000120120910000005

00000120120914000007

00000220120912000006

00000220120916000008

00000320120918000009

00000420120920000010

怎样用这张表?

在创建一个scan对象后,咱们setStartRow(00000120120901),setEndRow(00000120120914)。

这样,scan时只扫描userID=1的数据,且时间范围限定在这个指定的时间段内,知足了按用户以及按时间范围对结果的筛选。而且因为记录集中存储,性能很好。

而后使用SingleColumnValueFilter(org.apache.hadoop.hbase.filter.SingleColumnValueFilter),共4个,分别约束name的上下限,与category的上下限。知足按同时按文件名以及分类名的前缀匹配。

(注意:使用SingleColumnValueFilter会影响查询性能,在真正处理海量数据时会消耗很大的资源,且须要较长的时间。

在后续的博文中我将多举几种应用场景下rowKey的,能够知足简单条件下海量数据瞬时返回的查询功能)

若是须要分页还能够再加一个PageFilter限制返回记录的个数。

以上,咱们完成了高性能的支持多条件查询的HBase表结构设计。

——————————————————————————

by the way:

近期有时间会写一份Sample补充在这篇博文里,有须要的同窗能够持续关注。

后续的几篇关于HBase功能实现贴也陆续写做中。

HBase数据实现按期定量删除功能:http://blog.csdn.net/pirateleo/article/details/7964859

HBase在处理中文字符串时的问题:http://blog.csdn.net/pirateleo/article/details/7957109

陆续补充中……

相关文章
相关标签/搜索