hbase条件查询实现理论

Author:Pirate LeomyBlog: http://blog.csdn.net/pirateleo/myEmail: [email protected]转载请注明出处,谢谢。文中可能涉及到的API:Hadoop/HDFS:http://hadoop.apache.org/common/docs/current/api/HBase: http://hbase.apache.org/apidocs/index.html?overview-summary.htmlBegin!HBase的查询实现只提供两种方式:1、按指定RowKey获取唯一一条记录,get方法(org.apache.hadoop.hbase.client.Get)2、按指定的条件获取一批记录,scan方法(org.apache.hadoop.hbase.client.Scan)实现条件查询功能使用的就是scan方式,scan在使用时有以下几点值得注意:1、scan可以通过setCaching与setBatch方法提高速度(以空间换时间);2、scan可以通过setStartRow与setEndRow来限定范围。范围越小,性能越高。通过巧妙的RowKey设计使我们批量获取记录集合中的元素挨在一起(应该在同一个Region下),可以在遍历结果时获得很好的性能。3、scan可以通过setFilter方法添加过滤器,这也是分页、多条件查询的基础。下面举个形象的例子:我们在表中存储的是文件信息,每个文件有5个属性:文件id(long,全局唯一)、创建时间(long)、文件名(String)、分类名(String)、所有者(User)。我们可以输入的查询条件:文件创建时间区间(比如从20120901到20120914期间创建的文件),文件名(“中国好声音”),分类(“综艺”),所有者(“浙江卫视”)。假设当前我们一共有如下文件:内容列表ID CreateTime Name Category UserID1 20120902 中国好声音第1期 综艺 12 20120904 中国好声音第2期 综艺 13 20120906 中国好声音外卡赛 综艺 14 20120908 中国好声音第3期 综艺 15 20120910 中国好声音第4期 综艺 16 20120912 中国好声音选手采访 综艺花絮 27 20120914 中国好声音第5期 综艺 18 20120916 中国好声音录制花絮 综艺花絮 29 20120918 张玮独家专访 花絮 310 20120920 加多宝凉茶广告 综艺广告 4这里UserID应该对应另一张User表,暂不列出。我们只需知道UserID的含义:1代表 浙江卫视; 2代表 好声音剧组; 3代表 XX微博; 4代表 赞助商。调用查询接口的时候将上述5个条件同时输入find(20120901,20121001,"中国好声音","综艺","浙江卫视")。此时我们应该得到记录应该有第1、2、3、4、5、7条。第6条由于不属于“浙江卫视”应该不被选中。我们在设计RowKey时可以这样做:采用UserID + CreateTime + FileID组成rowKey,这样既能满足多条件查询,又能有很快的查询速度。需要注意以下几点:1、每条记录的RowKey,每个字段都需要填充到相同长度。假如预期我们最多有10万量级的用户,则userID应该统一填充至6位,如000001,000002...2、结尾添加全局唯一的FileID的用意也是使每个文件对应的记录全局唯一。避免当UserID与CreateTime相同时的两个不同文件记录相互覆盖。按照这种RowKey存储上述文件记录,在HBase表中是下面的结构:rowKey(userID 6 + time 8 + fileID 6) name category ....00000120120902000001000001201209040000020000012012090600000300000120120908000004000001201209100000050000012012091400000700000220120912000006000002201209160000080000032012091800000900000420120920000010怎样用这张表?在建立一个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/7964859HBase在处理中文字符串时的问题:http://blog.csdn.net/pirateleo/article/details/7957109陆续补充中……

你可能感兴趣的:(hbase,hbase,hbase条件查询)