Phoenix二级索引建立源码
Phoenix二级索引建立在hbase的coprocess功能,建立索引的时候使用是
二级索引建立过程,索引rowkey的构建是一个数据流,不停在后面追加,最后生成最终的rowkey形式
public byte[] buildRowKey(ValueGetter valueGetter, ImmutableBytesWritable rowKeyPtr, byte[] regionStartKey, byte[] regionEndKey, long ts) { //判断是否是构建本地索引,考虑两个条件:1.本地索引是否开启 2.startRK 是否传进来了 //如果开启本地索引,则在数据前面添加前缀,判断startRK是否是region起始startRK,如果是则使用该region的EndRK // 构建数据流对象,对数据进行put
|
如果是本地索引,则在rowkey前加入startrowkey索引
// For local indexes, we must prepend the row key with the start region key // 如果startRK为null,则其实使用的endRK } |
判断是否有加盐,如果有,则增加一个标志位,后面再更改这个标志位
if (isIndexSalted) {
|
如果在索引视图id不为null,会在索引rowkey中加入视图id
if (viewIndexId != null) {
|
判断是否启动多租户,如果启动多租户的场景,添加多租户信息;
if (isMultiTenant) {
|
dataRowKeySchema是数据表的信息,忽略在视图变量的中常量值,并标记出原表pk的rowkey的offset 和 length,方便后面定位数据表rowkey插入。
for (int i = dataPosOffset; i < dataRowKeySchema.getFieldCount(); i++) {
|
考虑索引的数据的顺序,考虑索引的顺序等
// 获取表达式索引,表达式索引默认值都为1,未开启的时候isNullAble为true Iterator<Expression> expressionIterator = indexedExpressions.iterator(); // nIndexedColumns 的构成是索引列+主键 如果是组合索引,则循环多个索引列 // dataPkPosition为-1则表示为表达式索引,否则为属性索引 // 主键pk 走这个分支 // 考虑列值的顺序,考虑字节的比较,考虑索引列的顺序 // 判断查询是否desc,默认为asc。 // 获取索引列的的数据类型,详情看后面getIndexColumnDataType函数 //根据数据列返回不同的datatype,判断该列是否可比较。不可比较的列有decimal,varchar,boolean,Binary // 获取列是否是逆序的 // 让不可比较的类型具有可比性 // 按位取异或值,二进制数比较肯定是字典序,从最高位开始比较,直到遇到第一个不一样的位,这个位上哪个数等于1哪个数就较大。 // 判断数据是不是一个固定长度的字段,如果不是根据数据的正序逆序添加一个标志位 } } |
//填充开始的加盐部分的字节位,规则是根据数据做hash,然后再对nIndexSaltBuckets取余
if (isIndexSalted) {
|
返回所有的生成的rowkey
return indexRowKey.length == length ? indexRowKey : Arrays.copyOf(indexRowKey, length);
|
根据数据列返回不同的datatype,判断该列是否可比较。不可比较的列有decimal,varchar,boolean,Binary等
// Since we cannot have nullable fixed length in a row key
|
让数据有可比性
protected static int toBytes(BigDecimal v, byte[] result, final int offset, int length) { |
原文:https://www.cnblogs.com/yankang/p/10617601.html