hbase rowkey设计
程序员文章站
2022-05-27 16:14:29
...
hbase的设计:
1.每一行数据必定是给某一个应用所使用的.即有一个appkey 如 94238
2.rowkey 就应该是这样了
concat_ws('\u0004' --使用 \u0004 作为每个字段分隔符
,concat(substr(md5(concat('app_name','94238')),1,4),':md5') --使用md5打散不同app的存放位置
,'app_name:biz' --这里开始实质的内容. 业务类型(biz)是 app_name
,'94238:app' --appkey是94238
,concat('ddd:',stat_date) --日期
,'2:cate' --具体的种类
) as rowkey
在来一个例子
select
concat(concat(substr(MD5(concat(coalesce(cat_id,''),'92811')),1,4),':md5'),'\004',cat_id,':cate1\004','92811:app\004',bc_type,':biz\004dhr:','${date}${hour}','\004',seller_id,':seller') as rowkey
stat_date --统计日期
,stat_hour --当前小时
,seller_id --卖家id
,seller_nick --卖家 nick
,bc_type --bc类型
,cat_id --主营类目id
,cat_name --主营类目名称
,pay_amt --金额
,rank_amt --排名
from seller_top_500 --卖家排名
--这个rowkey的设计背景是统计 每个大类小类下卖家金额top500
--根据'\004'做一级分隔符,':'做为二级分割,1-4位为MD5打散使用
--整个rowkey的含义分别是 先做md5,后依次是cate_id,appkey(92811),bc_type,时间,seller_id
--rowkey中每一个子key又分前缀后缀之分(值在前还是在后),比如cat_id就是前缀,时间(dhr)就是后缀.
--之所以时间是后缀的是因为,应用本身会精确定位到每一个小时,所以还是应该把每个小时的数据都放在一起
--之所以别的用前缀是因为,需要把数据打的越散越好.
--为什么不用seller_id作为打散列,而用cate_id,原因是取数是根据大类小类取top500,把seller_id,打散了完全没有意义
--为什么不用大类作为打散列的原因,是大类只有 B和C 2个值.打散的意义也不大.
--业务取数的时候有个cate_id的维表,根据上面的逻辑拼出一个rowkey来.
--scan 'table',STARTROW=>'md5+cate_id+app+bc_type+yyyymmddhh'
上一篇: tar
下一篇: [Linux] deepin与nginx