六、HBase的表设计
HBase表的设计 会直接影响hbase使用的效率 和 使用的便利性
HBase表的设计 主要是 列族的设计 和 行键的设计
1.列族的设计
在设计hbase表时候,列族不宜过多,越少越好,官方推荐hbase表的列族不宜超过3个。
经常要在一起查询的数据最好放在一个列族中,尽量的减少跨列族的数据访问。
如果有多个列族 多个列族中的数据应该设计的比较均匀
2.行键的设计
hbase表中行键是唯一标识一个表中行的字段,所以行键设计的好不好将会直接影响未来对hbase的查询的性能和查询的便利性
所以hbase中的行键是需要进行设计的
行键设计的基本原则:
行键必须唯一
必须唯一才能唯一标识数据
行键必须有意义
这样才能方便数据的查询
行键最好是字符串类型
因为数值类型在不同的系统中处理的方式可能不同
行键最好具有固定的长度
不同长度的数据可能会造成自然排序时排序的结果和预期不一致
行键不宜过长
行键最多可以达到64KB,但是最好是在10~100字节之间,最好不要超过16字节,越短越好,最好是8字节的整数倍。
行键的最佳实践:
散列原则:
行键的设计将会影响数据在hbase表中的排序方式,这会影响region切分后的结果,
要注意,在设计行键时应该让经常要查询的数据分散在不同的region中,防止某一个或某几个regionserver成为热点。
有序原则:
行键的设计将会影响数据在hbase表中的排序方式,所以一种策略是将经常连续查询的条件作为行键最前面的数据,
这样一来可以方便批量查询
七、hbase案例
用户表
id name age gender email
001 zhang 19 男 zhang@qq.com
002 wang 20 男 wang@qq.com
用户访问的网页
host viewtime content userid
www.baidu.com 2016-12-20 xxxx 001
www.sina.com 2016-11-10 xxxx 001
www.souhu.com 2016-11-09 xxxx 001
www.baidu.com 2016-12-20 xxxx 002
www.163.com 2016-12-20 xxxx 002
将这两个表和合并到Hbase表中,那么rowkey如何设计呢? 看业务需求吧,例如时间_姓名
2016-12-20_zhang
2016-12-20 _wang
这样设计的话,我们可以利用行键前缀过滤器:Filter filter = new PrefixFilter("2016-12-20".getBytes()) ;来进行扫描table。