`
tobyqiu
  • 浏览: 39347 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

hbase rowkey设计

 
阅读更多

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'

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics