主要参考:
简单总结
主要需要明白hbase存储的模式,
1.存储的数据没有类型的概念,都是以Bytes存储,这就是为什么java api里边需要取出来的时候:Bytes.toString,写入的时候Bytes.toBytes()
rowkey
2.通过{row key,column(=< family> + < label>),version} 唯一确定的单元,
1)通过单个 Row Key 访问。
2)通过 Row Key 的 range 全表扫描。
3)Row Key 可以使任意字符串(最大长度是64KB,实际应用中长度一般为 10 ~ 100bytes),在HBase 内部,Row Key 保存为字节数组。
列簇
HBase 表中的每个列都归属于某个列族。列族是表的 Schema 的一部分(而列不是),必须在使用表之前定义。列名都以列族作为前缀,例如 courses:history、courses:math 都属于 courses 这个列族。这个history,math就是每个cell里边的key,
时间戳
HBase 中通过 Row 和 Columns 确定的一个存储单元称为 Cell。每个 Cell 都保存着同一份数据的多个版本。 版本通过时间戳来索引,时间戳的类型是 64 位整型。时间戳可以由HBase(在数据写入时自动)赋值,
此时时间戳是精确到毫秒的当前系统时间。时间戳也 可以由客户显示赋值。如果应用程序要避免数据版本冲突,就必须自己生成具有唯一性的时间戳。每个 Cell 中,不同版本的数据按照时间倒序排序,即最新的数据排在最前面。
hbase常用命令行
下边分组举例 Shell 的各种操作。
general操作
查询 HBase 服务器状态 status。
查询hbase版本 version
ddl操作
1、 创建一个表
create ‘table1’, ‘tab1_id’, ‘tab1_add’, ‘tab1_info’
2、 列出所有的表
3、 获得表的描述
describe “table1”
4、 删除一个列族 disable alter enable 注意删除前,需要先把表disable
disable ‘table1’
alter ‘table1’, {NAME=>’tab1_add’, METHOD=>’delete’}
enable ‘table1’
5、 查看表是否存在
exists ‘table2’
6、 判断表是否为‘enable’
is_enabled ‘table1’
7、 删除一个表
disable ‘table1’
drop ‘table1’
dml操作
1、 插入几条记录
put ‘member’, ‘scutshuxue’, ‘info:age’, ‘24’
put ‘member’, ‘scutshuxue’, ‘info:birthday’, ‘1987-06-17’
put ‘member’, ‘scutshuxue’, ‘info:company’, ‘alibaba’
put ‘member’, ‘scutshuxue’, ‘address:contry’, ‘china’
put ‘member’, ‘scutshuxue’, ‘address:province’, ‘zhejiang’
put ‘member’, ‘scutshuxue’, ‘address:city’, ‘hangzhou’
put命令比较简单,只有这一种用法:
hbase> put ‘t1′, ‘r1′, ‘c1′, ‘value’, ts1
t1指表名,r1指行键名,c1指列名,value指单元格值。ts1指时间戳,一般都省略掉了。
2、 全表扫描 scan
3、 获得数据 get
-
获得一行的所有数据
-
获得某行,某列族的所有数据
-
获得某行,某列族,某列的所有数据
4、 更新一条记录 put(把scutshuxue年龄改为99)
put ‘member’, ‘scutshuxue’, ‘info:age’, 99
5、 删除 delete、 deleteall
- 删除行’scutshuxue’, 列族为‘info’ 中age的值
delete ‘member’, ‘scutshuxue’, ‘info:age’
- 删除整行
deleteall ‘member’, ‘scutshuxue’
6、 查询表中有多少行
count ‘member’
7、 给‘xiaoming’这个id增加’info:age’字段,并使用counter实现递增
incr ‘member’, ‘xiaoming’, ‘info:age’
8、 将整个表清空
truncate ‘member’