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

    }
相关推荐
Data_Journal1 天前
如何使用 Python 解析 JSON 数据
大数据·开发语言·前端·数据库·人工智能·php
威胁猎人1 天前
【黑产大数据】2025年全球KYC攻击风险研究报告
大数据·区块链
迎仔1 天前
00-大数据技术体系总览:大数据世界的“城市蓝图”
大数据
带刺的坐椅1 天前
用 10 行 Java8 代码,开发一个自己的 ClaudeCodeCLI?你信吗?
java·ai·llm·agent·solon·mcp·claudecode·skills
Nebula_g1 天前
线程进阶: 无人机自动防空平台开发教程(更新)
java·开发语言·数据结构·学习·算法·无人机
xixixi777771 天前
互联网和数据分析中的核心指标 DAU (日活跃用户数)
大数据·网络·数据库·数据·dau·mau·留存率
HAPPY酷1 天前
构造与析构:C++ 中对象的温柔生灭
java·jvm·c++
lang201509281 天前
Java JSR 250核心注解全解析
java·开发语言
czhc11400756631 天前
协议 25
java·开发语言·算法
逆光的July1 天前
如何解决超卖问题
java