1、HBase定义
由谷歌的BigTable发展而来,是NoSQL数据库。
2、HBase逻辑结构
数据存储在一张表中,有行有列,但底层无力存储结构(K-V)看,HBase更像一个multi-dimensional map
1)Name Space
命名空间,每个命名空间下有多个表,Hbase有两个自带的命名空间:hbase、default,
hbase存放的是HBase内置的表,default表是用户默认使用的命名空间
2)Region
类似关系型数据库的表的概念。HBase定义表时只需要申明列族即可,无需申明具体的列,所以写入数据时,字段可以动态、按需指定。
3)Row
每行数据都由一个RowKey和多个列组成,数据按照RowKey的字典顺序存储,且查询数据时只能根据RowKey进行检索。
4)Column
每个列由ColumnFamily(列族)和ColumnQualifier(列限定符)进行限定,建表时只需指名列族,列限定符无需预先定义。
5)Time Stamp
用于标识数据的不同版本(version),如果不指定时间戳,系统会自动为其加上该字段,其值为写入HBase的时间。
6)Cell
由{rowkey,column family:column qualifier,time stamp} 唯一确定的单元,cell中的数据没有类型,都是字节码形式存储。
操作数据:DML;操作表:DDL;
3、HBase Shell 操作
1)基本操作
1、 进入Hbase客户端命令行
hbase shell
quit 退出
2、 查看帮助命令
help ‘命令名’
3、 查看数据库中有哪些表
list
2)表的操作DDL
1、创建表
create ‘student’ , ‘info’ //前者为表名,后者为列族,列族可多个、至少一个
create ‘表名’, {NAME => ‘列族名1’, VERSIONS => 版本号, TTL => 过期时间, BLOCKCACHE => true}
2、描述表
describe ‘student’
COLUMN FAMILIES DESCRIPTION
{NAME => ‘info1’, DATA_BLOCK_ENCODING => ‘NONE’, BLOOMFILTER => ‘ROW’, REPLICATION_SCOPE => ‘0’, VERSIONS => ‘1’, COMPRESSION => ‘NONE’, MIN_VERSIONS => ‘0’, TTL => ‘FOREVER’, KE
EP_DELETED_CELLS => ‘FALSE’, BLOCKSIZE => ‘65536’, IN_MEMORY => ‘false’, BLOCKCACHE => ‘true’}
{NAME => ‘info2’, DATA_BLOCK_ENCODING => ‘NONE’, BLOOMFILTER => ‘ROW’, REPLICATION_SCOPE => ‘0’, VERSIONS => ‘1’, COMPRESSION => ‘NONE’, MIN_VERSIONS => ‘0’, TTL => ‘FOREVER’, KE
EP_DELETED_CELLS => ‘FALSE’, BLOCKSIZE => ‘65536’, IN_MEMORY => ‘false’, BLOCKCACHE => ‘true’}
2 row(s) in 0.0790 seconds
3、改变表
alter ‘student’ ,{NAME=>‘info’, VERSIONS=>3} //VERSIONS为3说明将info列族的数据存放3个版本
alter ‘student’ ,‘info2’ //增加列族
alter ‘student’ ,{NAME=>‘info2’, METHOD=>‘delete’}
4、删除表
disable ‘student’ 先令表下线,上线为enable
drop ‘student’ 再删除表,不然报错删不掉
5、展示命名空间
list_namespace
6、创建命名空间
create_namespace ‘bigdata’
7、在别打命名空间创建表
create “bigdata:student”,“info”
在表的前面加上 命名空间名:,不加为默认default命名空间
8、删除命名空间
drop_namespace ‘bigdata’
注意:命名空间内要没有表了才能删
9、判断表是否存在
exists ‘user’
3)数据的操作DML
1、插入数据
put ‘student’, ‘1001’, ‘info:name’, ‘zhangsan’
student:表名,1001:row key,info:name:族列:列名,zhangsan:要插入的值。
2、查询数据
scan ‘student’ //全表扫描,表中数据按照keyrow的字典序升序排列
scan ‘student’, {STARTROW=>‘1001’, STOPROW=>‘1003’} //指定rowkey的扫描,[1001,1003),也可只写一边
get ‘student’, ‘1001’ //返回row key = 1001的所有列族:列的信息,get至少要2个参数
get ‘student’, ''1001, ‘info1’ //返回1001的info1的所有值
get ‘student’, ‘1001’, ‘info1:name’ //返回1001的info1:name的值count ‘student’ //查询记录数
3、更改数据
put ‘student’, ‘1001’, ‘info:name’, ‘zhangsan2’
注意:此时原来的值zhangsan还未被删除,可用
scan ‘student’, {RAW=>true, VERSIONS=>10} 来查看10个版本以内的所有值,但正常返回时zhangsan不会返回给用户。
也可指定时间戳,会返回用于时间戳最大的那条信息。
4、删除数据
delete ‘student’, ‘1001’, ‘info1:name’ //至少3个参数
delete之后,时间戳最大的type=DeleteColumn, 不会被返回,旧的时间戳到值也不会被返回。deleteall ‘student’, ‘1001’ //删除整一行
truncate ‘student’ //清空表