HBase之基本操作!
HBase之基本操作!
月伴飞鱼
Apache HBase
是Hadoop
中一个支持分布式的、可扩展的大数据存储的数据库。当需要对大数据进行随机、实时读/写访问时,可以用
Apache HBase
。
HBase特点
列式存储:
HBase
是面向列族的非关系型数据库,每行数据列都可以不同,并且列可以按照需求进行动态增加。
- 因此在开始创建
HBase
表时,可以只创建列族,等需要时再创建相应的列。
数据压缩:
列式存储意味着数据往往类型相同,可以采用某种压缩算法进行统一的压缩存储。
海量存储:
HDFS
支持的海量存储,存储PB
级数据仍能有百毫秒内的响应速度。
行式存储原理与特点
数据在磁盘上是以行的形式存储在磁盘上,同一行的数据紧挨着存放在一起。
在查询过程中,需要磁盘转动多次,才能完成数据的定位和返回结果。
列式存储原理与特点
在列式存储中,由于同一列的数据被紧挨着存放在了一起。
按照列找到需要的数据,磁盘的转动次数少,性能也会提高。
列式存储不仅具有按需查询来提高效率的优势。
由于同一列的数据属于同一种类型,如数值类型,字符串类型等,相似度很高。
- 还可以选择使用合适的编码压缩可减少数据的存储空间,进而减少IO提高读取性能。
Shell操作
进入HBase
客户端命令操作界面:
1 | hbase shell |
查看帮助命令:
1 | hbase(main):001:0> help |
查看当前数据库中有哪些表:
1 | hbase(main):006:0> list |
创建一张表:
创建user表, 包含
base_info、extra_info
两个列族。
1 | hbase(main):007:0> create 'user', 'base_info', 'extra_info' |
1 | create 'user', {NAME => 'base_info', VERSIONS => '3'},{NAME => 'extra_info'} |
添加数据操作:
向user表中插入信息,
rowkey
为 rk0001,列族base_info
中添加name列标示符,值为zhangsan。
1 | hbase(main):008:0> put 'user', 'rk0001', 'base_info:name', 'zhangsan' |
向user表中插入信息,
rowkey
为rk0001,列族base_info
中添加age列标示符,值为20。
1 | hbase(main):010:0> put 'user', 'rk0001', 'base_info:age', 20 |
查询数据:
通过
rowkey
进行查询:
- 获取user表中
rowkey
为rk0001的所有信息。
1 | hbase(main):006:0> get 'user', 'rk0001' |
查看
rowkey
下面的某个列族的信息:
- 获取user表中
rowkey
为rk0001,base_info
列族的所有信息。
1 | hbase(main):007:0> get 'user', 'rk0001', 'base_info' |
查看
rowkey
指定列族指定字段的值:
- 获取user表中
rowkey
为rk0001,base_info
列族的name、age列标示符的信息。
1 | hbase(main):008:0> get 'user', 'rk0001', 'base_info:name', 'base_info:age' |
查看
rowkey
指定多个列族的信息
- 获取user表中
rowkey
为rk0001,base_info
、extra_info
列族的信息。
1 | hbase(main):010:0> get 'user', 'rk0001', 'base_info', 'extra_info' |
1 | hbase(main):011:0> get 'user', 'rk0001', {COLUMN => ['base_info', 'extra_info']} |
1 | hbase(main):012:0> get 'user', 'rk0001', {COLUMN => ['base_info:name', 'extra_info:address']} |
指定
rowkey
与列值查询:
- 获取user表中
rowkey
为rk0001,cell的值为zhangsan的信息。
1 | hbase(main):013:0> get 'user', 'rk0001', {FILTER => "ValueFilter(=, 'binary:zhangsan')"} |
指定
rowkey
与列值模糊查询:
- 获取user表中
rowkey
为rk0001,列标示符中含有a的信息。
1 | hbase(main):015:0> get 'user', 'rk0001', {FILTER => "(QualifierFilter(=,'substring:a'))"} |
插入一批数据:
1 | hbase(main):016:0> put 'user', 'rk0002', 'base_info:name', 'fanbingbing' |
查询所有数据:
- 查询user表中的所有信息
1 | hbase(main):020:0> scan 'user' |
列族查询:
- 查询user表中列族为
base_info
的信息。Scan:
设置是否开启Raw模式,开启Raw模式会返回包括已添加删除标记但是未实际删除的数据。
VERSIONS指定查询的最大版本数。
1 | hbase(main):021:0> scan 'user', {COLUMNS => 'base_info'} |
多列族查询:
- 查询user表中列族为info和data的信息。
1 | hbase(main):023:0> scan 'user', {COLUMNS => ['base_info', 'extra_info']} |
指定列族与某个列名查询:
- 查询user表中列族为
base_info
、列标示符为name的信息。
1 | hbase(main):025:0> scan 'user', {COLUMNS => 'base_info:name'} |
指定列族与列名以及限定版本查询:
- 查询user表中列族为
base_info
、列标示符为name的信息,并且版本最新的5个。
1 | hbase(main):026:0> scan 'user', {COLUMNS => 'base_info:name', VERSIONS => 5} |
指定多个列族与按照数据值模糊查询:
- 查询
user
表中列族为base_info
和extra_info
且列标示符中含有a字符的信息。
1 | hbase(main):027:0> scan 'user', {COLUMNS => ['base_info', 'extra_info'], FILTER => "(QualifierFilter(=,'substring:a'))"} |
rowkey
的范围值查询:
- 查询user表中列族为info,rk范围是
[rk0001, rk0003)
的数据。
1 | hbase(main):028:0> scan 'user', {COLUMNS => 'base_info', STARTROW => 'rk0001', ENDROW => 'rk0003'} |
指定rowkey模糊查询:
- 查询user表中
rowkey
以rk字符开头的。
1 | hbase(main):029:0> scan 'user',{FILTER=>"PrefixFilter('rk')"} |
更新数据值:
- 把user表中
rowkey
为rk0001的base_info
列族下的列name修改为zhangsansan。
1 | hbase(main):030:0> put 'user', 'rk0001', 'base_info:name', 'zhangsansan' |
指定
rowkey
以及列名进行删除:
- 删除user表
rowkey
为rk0001,列标示符为base_info:name
的数据。
1 | hbase(main):032:0> delete 'user', 'rk0001', 'base_info:name' |
指定
rowkey
,列名以及字段值进行删除:
- 删除user表
rowkey
为rk0001,列标示符为base_info:name
,timestamp为1392383705316的数据。
1 | hbase(main):033:0> delete 'user', 'rk0001', 'base_info:age', 1564745324798 |
删除
base_info
列族
1 | hbase(main):034:0> alter 'user', NAME => 'base_info', METHOD => 'delete' |
1 | hbase(main):035:0> alter 'user', 'delete' => 'base_info' |
删除user表数据:
1 | hbase(main):036:0> truncate 'user' |
删除user表:
1 | #先disable 再drop |