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

    }
相关推荐
虫小宝11 分钟前
解决Spring Boot中的安全漏洞与防护策略
java·spring boot·后端
LXMXHJ24 分钟前
Java-Redis-Clickhouse-Jenkins-MybatisPlus-Zookeeper-vscode-Docker
java·redis·java-zookeeper
又该洗头了27 分钟前
Swagger
java·spring·swagger
bingbingyihao38 分钟前
Linux安装ftp、Java的FTP上传下载文件工具类
java·linux·centos
u0104058361 小时前
如何利用Java Stream API简化集合操作?
java·开发语言
G皮T1 小时前
【MyBatis】MyBatis 理论 40 问(二)
java·数据库·spring boot·spring·mybatis·关系映射
thanks1 小时前
Bond——大数据时代的数据交换和存储格式
大数据·对象存储
小羊子说1 小时前
Android 开发中 C++ 和Java 日志调试
android·java·c++
TechQuester1 小时前
解决GPT-4o耗电难题!DeepMind新算法训练效率提升13倍,能耗降低10倍!
java·c++·人工智能·python·算法·chatgpt
球球King1 小时前
工厂模式之简单工厂模式
java·jvm·简单工厂模式