hbase 扫盲和 kv 设计
hbase 不像传统数据库.区别主要是
orcl 里面 建表 要指定多少列,数据类型 等.
hbase 里面 也有建表的概念,但是只不过定义了一个表名,里面的列是不定义的.任何数据都可以往表里面塞,换句话,如果我忘记了 塞了什么,都没地方去查.这样会导致表会无限膨胀,而且没人指定表里面有什么.所以nosql数据库 都设置了生命周期, 多少时间自动回收空间.
那么塞进去的,要取出来就只能靠rowkey.
你把rowkey告诉别人,别人才能取数.
比如 下面这个
concat(concat(substr(MD5(concat(coalesce(acty_id,''),'93020')),1,4),':md5'),'\004',acty_id,':acty\004','93020:app\004',acty_id_p,':actyp\004',bc_type,':biz\004','dhr:','${date}${hour}','\004',seller_id,':seller') as rowkey
93020 是app_id ,
这个key是由 app_id,acty_id,acty_id_p,bc_type,dhr,seller_id 等组成的.
换句话,这些东西可以定义 row的唯一性,并且提供了给你select的条件.
\004 是分隔符
这个列的第一搜索条件是app_id(93020),第二搜索条件是dhr,然后是seller_id,,然后依次是bc_type,acty_id_p,acty_id,
但是rowkey的设计并不是按照 先app,然后时间,seller来的.
原因是为了打散数据.
一个表可能有多个app,也有可能只有一个app.
如果把app现在前面
rowkey 应该是 app+时间+卖家id+卖家的属性.
那么select的时候 先回扫所有的app=1的数据,然后再扫,时间=你要的时间,再扫卖家id.
这样效率太低了.
先把 活动id+app 作md5 就是为了打散这些数据,然他存在不同的地方.为啥不用 app+活动id 作md5,也是这个原因.app肯定是比活动少的.用app+活动id 的效果没有 活动id+app 的好.
打散了以后, 因为我的业务逻辑不是要具体定位那个seller. 而是要 参加了活动的,(子活动+主活动),各种类型的卖家,在某个时间段的 所有卖家.
所有接下来就应该按照我的需求,把app,活动id,父活动id,带上.
注意 别的都是v+key. 如果 acty_id,':acty\004'
而到了 时间这里 是 'dhr:','${date}${hour}',
原因是,别的这么设计就是为了打散数据,而时间的话,需要给他一个标志位,定位时间节点.