HBase 数据模型


HBase 的数据储存如下示例(官方文档例子):

表格中的空白单元不会占用物理存储空间,只是概念上存在

表格中的空白单元不会占用物理存储空间,只是概念上存在

从 schema 的角度看,类似如下:

{
  "com.cnn.www": {
    contents: {
      t6: contents:html: "<html>..."
      t5: contents:html: "<html>..."
      t3: contents:html: "<html>..."
    }
    anchor: {
      t9: anchor:cnnsi.com = "CNN"
      t8: anchor:my.look.ca = "CNN.com"
    }
    people: {}
  }
  "com.example.www": {
    contents: {
      t5: contents:html: "<html>..."
    }
    anchor: {}
    people: {
      t5: people:author: "John Doe"
    }
  }
}

每一行中,列的组成都是灵活的,行与行之间并不需要遵循相同的列定义, 也就是HBase数据表 ”schema-less“ 的特点。

RowKey

用来表示唯一一行记录的主键,HBase的数据是按照 RowKey 的字典顺序进行全局排序的,所有的查询都只能依赖于这一个排序维度。

通过下面一个例子来说明一下”字典排序“的原理:

RowKey {“abc”, “a”, “bdf”, “cdf”, “defg”} 按字典排序后的结果为 {“a”, “abc”, “bdf”, “cdf”, “defg”}

也就是说,当两个 RowKey 进行排序时,先对比两个 RowKey 的第一个字节,如果相同,则对比第二个字节,依此类推…如果在对比到第M个字节时,已经超出了其中一个 RowKey 的字节长度,那么,短的 RowKey 要被排在另外一个RowKey的前面;