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

    }
相关推荐
SimonKing12 分钟前
告别传统读写!RandomAccessFile让你的Java程序快人一步
java·后端·程序员
Little-Hu14 分钟前
QML TextEdit组件
java·服务器·数据库
暗影八度21 分钟前
Spark流水线数据质量检查组件
大数据·分布式·spark
白鲸开源37 分钟前
Linux 基金会报告解读:开源 AI 重塑经济格局,有人失业,有人涨薪!
大数据
海豚调度38 分钟前
Linux 基金会报告解读:开源 AI 重塑经济格局,有人失业,有人涨薪!
大数据·人工智能·ai·开源
白鲸开源42 分钟前
DolphinScheduler+Sqoop 入门避坑:一文搞定数据同步常见异常
大数据
Edingbrugh.南空1 小时前
Flink ClickHouse 连接器数据读取源码深度解析
java·clickhouse·flink
NE_STOP1 小时前
SpringBoot--简单入门
java·spring
hqxstudying2 小时前
Java创建型模式---原型模式
java·开发语言·设计模式·代码规范
学术小八2 小时前
第二届云计算与大数据国际学术会议(ICCBD 2025)
大数据·云计算