欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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