• hbase学习 rowKey的设计-4


     

    访问hbase table中的行,只有三种方式:

    1 通过单个row key访问

    2 通过row key的range

    3 全表扫描

    Hadoop Sequence File

    文中可能涉及到的API:

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

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

    Begin!

    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 UserID 1 2 3 4 5 6 7 8 9 10
    20120902 中国好声音第1期 综艺 1
    20120904 中国好声音第2期 综艺 1
    20120906 中国好声音外卡赛 综艺 1
    20120908 中国好声音第3期 综艺 1
    20120910 中国好声音第4期 综艺 1
    20120912 中国好声音选手采访 综艺花絮 2
    20120914 中国好声音第5期 综艺 1
    20120916 中国好声音录制花絮 综艺花絮 2
    20120918 张玮独家专访 花絮 3
    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 ....

    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表结构设计。

     

    转载:

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

    参考文章:http://blog.csdn.net/lzm1340458776/article/details/44941953

     

     

     
     
  • 相关阅读:
    无约束优化算法——牛顿法与拟牛顿法(DFP,BFGS,LBFGS)
    撤销重做功能实现
    疯狂值班表(人员跟日期生成的视图)
    从零开始---控制台用c写俄罗斯方块游戏(2)
    unity3d关于碰撞问题
    主进程和服务进程通信调用Acrobat.AcroPDDoc时出现的问题
    echarts
    Wpf DataGrid动态添加列,行数据(二)
    Wpf DataGrid动态添加列,行数据(一)
    wpf学习资料链接(做记录)
  • 原文地址:https://www.cnblogs.com/200911/p/4972573.html
Copyright © 2020-2023  润新知