当前位置: 首页 > news >正文

Hbase的Rowkey设计

Hbase的Rowkey设计

rowkey设计

    # 1)长度原则#      最大64KB,推荐长度10~100 byte#      最好设为8的倍数,能短则短,rowkey如果太长会影响性能。# 2)唯一原则:rowkey应该具备唯一性# 3)散列原则#      3-1)盐值散列,不能使用时间戳直接作为rowkey#          在rowkey加随机数#      3-2)字符串反转#          时间戳,电话号码(前面位数相同容易分到一个分区)#      3-3)计算分区号,HashMap# ASCII有序,常用列设计Rowkey放在前面
分区设计+Rowkey设计,以手机号码+日期为例

生成分区键,以6个分区
分区号:0,1,2,3,4,5
分区范围:(-∞,0),[0,1),[1,2),[2,3),[3,4),[4,5),[5,+∞)
RowKey前缀:0|,1|,2|,3|,4|,5|
Rowkey范围:(-∞,0|),[0|,1|),[1|,2|),[2|,3|),[2|,3|),[4|,5|),[5|,+∞)

    /*** 生成分区 键(优化)** @param regionCount 分区数* @return*/private byte[][] getSplitKeys(int regionCount) {int splitKeyCount = regionCount - 1;int length = Integer.toString(regionCount - 2).length();byte[][] bs = new byte[splitKeyCount][];List<byte[]> bsList = new ArrayList<>();for (int i = 0; i < splitKeyCount; i++) {String key = NumberUtils.format(i, length) + "|";
//            System.out.println(key);bsList.add(Bytes.toBytes(key));}bsList.toArray(bs);return bs;}

生成分区号
通过手机号+日期生成分区号,得到Rowkey的前缀。

 /*** TODO:计算分区号** @param tel* @param date* @return*/protected String getRagionNum(String tel, String date) {//手机号码的后4位String usercode = tel.substring(tel.length() - 4);//年月日时分秒(年月)String yearMonth = date.substring(0, 6);int userCodeHash = usercode.hashCode();int yearMonthHash = yearMonth.hashCode();//crc检验采用异或算法int crc = Math.abs(userCodeHash ^ yearMonthHash);int regionNum = crc % ValueConstant.REGION_COUNT;int length = Integer.toString(ValueConstant.REGION_COUNT - 2).length();return NumberUtils.format(regionNum, length);}

Rowkey

 String rowkey = getRagionNum(call1, calltime) + "_" + call1 + "_" + calltime;

补零工具类

/*** 将数字格式化为字符串* @param num* @param length* @return*/public static String format(int num,int length){StringBuffer stringBuffer = new StringBuffer();for (int i = 0; i < length; i++) {stringBuffer.append("0");}DecimalFormat df =new DecimalFormat(stringBuffer.toString());return df.format(num);}
http://www.lryc.cn/news/262736.html

相关文章:

  • 软考机考考试第一批经验分享
  • 架构简洁之道有感,谈谈软件组件聚合的张力
  • 计算机网络 网络层上 | IP数据报,IP地址,ICMP,ARP等
  • 金智融门户(统一身份认证)同步数据至钉钉通讯录
  • 服务器RAID配置及功能介绍
  • vue + element 实现鼠标左右滑动效果
  • gitlab 安装
  • idea中定时+多数据源配置
  • Python---多任务的介绍
  • Kubernetes 的用法和解析 -- 4
  • 【fabrc.js】 操作鼠标自由绘制图形:矩形、圆形、直线等图形【画图功能】
  • WPF 显示PDF、PDF转成图片
  • CODESYS的Robotics_PickAndPlace_without_Depictor例程解释
  • 通过全流量分析Web业务性能好坏
  • 【C语言】自定义类型——枚举、联合体
  • 大模型自定义算子优化方案学习笔记:CUDA算子定义、算子编译、正反向梯度实现
  • 【密码学基础】Diffie-Hellman密钥交换协议
  • 最新AI绘画Midjourney绘画提示词Prompt教程
  • AI助力DevOps新时代
  • Spring之容器:IOC(2)
  • Spring 依赖查找知识点总结
  • html5新增特性
  • 4、APScheduler: 详解Scheduler种类用法、常见错误与解决方法【Python3测试任务管理总结】
  • 微服务实战系列之ZooKeeper(实践篇)
  • C++ 开发中为什么要使用继承
  • 2020蓝桥杯c组纸张大小
  • 【Image】图像处理
  • JAVA对文档加密
  • EmbedAI:一个可以上传文件训练自己ChatGPT的AI工具,妈妈再也不用担心我的GPT不会回答问题
  • runCatching异常捕获onSuccess/onFailure返回函数,Kotlin