UP | HOME

Hbase 数据模型笔记(1)
发布于 Aug 17, 2020 by ThinkCat.

Table of Contents

基础

  1. 应用程序是以表的方式在HBase存储数据的
  2. 表是由行和列构成的,所有的列是从属于某一个列族的
  3. 行和列的交叉点称之为cell,cell是版本化的。cell的内容是不可分割的字节数组
  4. HBase的表是按key排序的,排序方式之针对字节的。所有的表都必须要有主键-key

表是在schema声明的时候定义的。

行键是不可分割的字节数组。行是按字典排序由低到高存储在表中的。一个空的数组是用来标识表空间的起始或者结尾。

列族

  1. 在HBase是列族一些列的集合。一个列族所有列成员是有着相同的前缀。
  2. 列族必须在表建立的时候声明。column就不需要了,随时可以新建。
  3. 在物理上,一个的列族成员在文件系统上都是存储在一起。

Cells

A {row, column, version} 元组就是一个HBase中的一个 cell。Cell的内容是不可分割的字节数组。

操作

操作有四种:

  1. Get: 返回特定行的属性,通过 HTable.get 执行
  2. Put: 向表新增行(key如果不存在),或者是更新行(key已经存在),通过 HTable.put (writeBuffer) 或 HTable.batch (non-writeBuffer)执行
  3. Delete: 从表中删除一行,通过HTable.delete 执行
  4. Scan: 允许多行特定属性迭代

    HTable htable = ...      // instantiate HTable
    
    Scan scan = new Scan();
    scan.addColumn(Bytes.toBytes("cf"),Bytes.toBytes("attr"));
    scan.setStartRow( Bytes.toBytes("row"));                   // start key is inclusive
    scan.setStopRow( Bytes.toBytes("row" +  (char)0));  // stop key is exclusive
    ResultScanner rs = htable.getScanner(scan);
    try {
      for (Result r = rs.next(); r != null; r = rs.next()) {
      // process result...
    } finally {
      rs.close();  // always close the ResultScanner!
    }
    

    Hbase 没有修改数据的合适方法,通过创建名为墓碑(tombstones)的新标志进行处理。这些墓碑和死去的值,在主紧缩时清除。