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|,+∞)

java 复制代码
    /**
     * 生成分区 键(优化)
     *
     * @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的前缀。

java 复制代码
 /**
     * 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

java 复制代码
 String rowkey = getRagionNum(call1, calltime) + "_" + call1 + "_" + calltime;

补零工具类

java 复制代码
/**
     * 将数字格式化为字符串
     * @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);

    }
相关推荐
毕业设计制作和分享2 小时前
springboot150基于springboot的贸易行业crm系统
java·vue.js·spring boot·后端·毕业设计·mybatis
小梁努力敲代码7 小时前
java数据结构--List的介绍
java·开发语言·数据结构
摸鱼的老谭7 小时前
构建Agent该选Python还是Java ?
java·python·agent
lang201509288 小时前
Spring Boot 官方文档精解:构建与依赖管理
java·spring boot·后端
夫唯不争,故无尤也8 小时前
Tomcat 启动后只显示 index.jsp,没有进入你的 Servlet 逻辑
java·servlet·tomcat
zz-zjx8 小时前
Tomcat核心组件全解析
java·tomcat
Deschen8 小时前
设计模式-外观模式
java·设计模式·外观模式
why技术9 小时前
从18w到1600w播放量,我的一点思考。
java·前端·后端
夫唯不争,故无尤也9 小时前
JavaWeb流式传输速查宝典
java·流式传输
言之。9 小时前
大模型嵌入 vs ES:语义搜索与关键字搜索
大数据·elasticsearch·搜索引擎