Hbase 之KeyValue结构详解

源码

在这里插入图片描述

  • 源码注释部分翻译
HBase 键值。这是基本的 HBase 类型。

KeyValue 包装一个字节数组,并将偏移量和长度放入传递的数组中,从哪里开始将内容解释为 KeyValue。
字节数组中的 KeyValue 格式为: <keylength> <valuelength> <key> <value> 
Key 进一步分解为: <rowlength> <row> <columnfamilylength> <columnfamily> <columnqualifier> <timestamp> <keytype> 
行长最大值为 Short.MAX_SIZE,
列族长度最大值为 Byte.MAX_SIZE,
列限定符 + 键长度必须 < Integer.MAX_SIZE。
该列不包含 familyqualifier 分隔符 COLUMN_FAMILY_DELIMITER

KeyValue结构

在这里插入图片描述

  • 在KeyValue中,其中的KeyLength为4B:
  • ValueLength标识Value在字节数组中所占的长度,为4B:
  • Row Length:存储rowkey的长度,为2B
  • TimeStamp是Long型,肯定就是占8B:
  • KeyType为1B:

从ColumnQualifier开始内容前面不在带有长度了。TimeStamp和KeyType因为所占的长度是固定的,所以不用包含长度信息。而Qualifier的长度信息,则用以下的方式可以得出:

new Ordering[(ImmutableBytesWritable, KeyValue)] {
      override def compare(x: (ImmutableBytesWritable, KeyValue), y: (ImmutableBytesWritable, KeyValue)): Int = {
        x._2.getFamilyLength()
        x._2.getQualifierLength
      }
    }

KeyValue的实现

在Hbase中,所有数据都是以Byte的形式存在的。在KeyValue中,使用的是byte数组来存储实际内容。

 // KeyValue core instance fields.
  private byte [] bytes = null;  // an immutable byte array that contains the KV
  private int offset = 0;  // offset into bytes buffer KV starts at
  private int length = 0;  // length of the KV starting from offset.

其中,bytes数组用来存储KeyValue中的实际内容,offset表示KeyValue在数组bytes中的起始位置length则是KeyValue在数组bytes中自起始位置offset后的长度

KeyValue提供了一系列的Offset方法在数组中定位各个字段的的起始位置,如getValueOffset,getRowOffset等。也提供了一系列的length方法来获取KeyValue中各个字段的大小。


操作KeyValue

把keyValue 数据取出放到Map里

 Map<String, Object> stringMap = new HashMap<>();
 stringMap.put("row", Bytes.toStringBinary(getRowArray(), getRowOffset(), getRowLength()));
 stringMap.put("family",Bytes.toStringBinary(getFamilyArray(), getFamilyOffset(), getFamilyLength()));
 stringMap.put("qualifier",Bytes.toStringBinary(getQualifierArray(), getQualifierOffset(), getQualifierLength()));
 stringMap.put("timestamp", getTimestamp());
 stringMap.put("vlen", getValueLength());
 Iterator<Tag> tags = getTags();
 if (tags != null) {
  List<String> tagsString = new ArrayList<String>();
  while (tags.hasNext()) {
   tagsString.add(tags.next().toString());
  }
  stringMap.put("tag", tagsString);
 }
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值