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);

    }
相关推荐
金銀銅鐵18 分钟前
[Java] 以 IntStream 为例,浅析 Stream 的实现
java·后端
Lx35221 分钟前
Hadoop日志分析实战:快速定位问题的技巧
大数据·hadoop
曳渔1 小时前
UDP/TCP套接字编程简单实战指南
java·开发语言·网络·网络协议·tcp/ip·udp
hqxstudying2 小时前
JAVA项目中邮件发送功能
java·开发语言·python·邮件
最初的↘那颗心2 小时前
Java HashMap深度解析:原理、实现与最佳实践
java·开发语言·面试·hashmap·八股文
小兔兔吃萝卜2 小时前
Spring 创建 Bean 的 8 种主要方式
java·后端·spring
亲爱的马哥2 小时前
重磅更新 | 填鸭表单TDuckX2.9发布!
java
Java中文社群2 小时前
26届双非上岸记!快手之战~
java·后端·面试
whitepure2 小时前
万字详解Java中的面向对象(二)——设计模式
java·设计模式
whitepure3 小时前
万字详解Java中的面向对象(一)——设计原则
java·后端