Hbase 数据模型笔记(1)
发布于 Aug 17, 2020 by ThinkCat.
基础
- 应用程序是以表的方式在HBase存储数据的
- 表是由行和列构成的,所有的列是从属于某一个列族的
- 行和列的交叉点称之为cell,cell是版本化的。cell的内容是不可分割的字节数组
- HBase的表是按key排序的,排序方式之针对字节的。所有的表都必须要有主键-key
表
表是在schema声明的时候定义的。
行
行键是不可分割的字节数组。行是按字典排序由低到高存储在表中的。一个空的数组是用来标识表空间的起始或者结尾。
列族
- 在HBase是列族一些列的集合。一个列族所有列成员是有着相同的前缀。
- 列族必须在表建立的时候声明。column就不需要了,随时可以新建。
- 在物理上,一个的列族成员在文件系统上都是存储在一起。
Cells
A {row, column, version} 元组就是一个HBase中的一个 cell。Cell的内容是不可分割的字节数组。
操作
操作有四种:
- Get: 返回特定行的属性,通过 HTable.get 执行
- Put: 向表新增行(key如果不存在),或者是更新行(key已经存在),通过 HTable.put (writeBuffer) 或 HTable.batch (non-writeBuffer)执行
- Delete: 从表中删除一行,通过HTable.delete 执行
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)的新标志进行处理。这些墓碑和死去的值,在主紧缩时清除。