(二)hbase的数据库操作
hbase的数据库操作
文章目录
1:数据库基本操作
进入客户端:bin/hbase shell
查看数据库状态:status
获取帮助:help
help 获取所有命令提示
help "dml" 获取一组命令的提示
help "put" 获取一个单独命令的提示帮助,put,get,scan
查看所有表:list
退出:exit
2:表结构操作
list查看所有表
2.1:表的创建
创建一张 hbase 表,表名叫做 user,该表有 info 和 data 两个列簇,注意,创建表的时候不用指定列的信息,插入数据的时候才需要指定 key-value 的信息,这个 key 就是列
create 'user', 'info', 'data' 也可以这样写:
create 'user',{NAME=>'info'},{NAME=>'data'}
创建一张表叫做 user_info,包含两个列簇 base_info 和 extra_info,并且分别指定这两个列簇的数据的版本数为 3 和 1
create 'user_info',{NAME=>'base_info',VERSIONS=>3 },{NAME=>'extra_info',VERSIONS=>1}
create 'user',{NAME=>'info',VERSIONS=>3 },{NAME=>'data',VERSIONS=>2}
- 创建表指定过期策略:可以使用TTL设置老化数据。单位秒
create 'table' , {NAME => 'f', TTL => 7776000, DATA_BLOCK_ENCODING => 'NONE', BLOOMFILTER => 'ROW', VERSIONS => 1}
- 创建分区表:提前创建多region,防止region分裂
create 'table','f1', { NUMREGIONS => 5, SPLITALGO => 'HexStringSplit' }
NUMREGIONS :region个数
SPLITALGO :指定rowkey的分配算法,可选HexStringSplit、UniformSplit、DecimalStringSplit默认是hash算法,
- SPLITALGO 参数说明
HexStringSplit、UniformSplit、DecimalStringSplit说明:
(1)UniformSplit(占用空间小,rowkey前缀完全随机):将可能的键的空间平均分割的聚合体。当键是近似一致的随机字节时(例如散列),建议使用这个。行是范围为 00 => FF 的原始字节值,用0右填充以保持相同的 memcmp()顺序。对于byte[]环境来说,这是一种自然的算法,可以节省空间,但是对于可读性来说,它并不一定是最简单的。
(2)HexStringSplit(占用空间大,rowkey是十六进制的字符串作为前缀的):HexStringSplit 是一个典型的 RegionSplitter.SplitAlgorithm来选择 region 边界。HexStringSplit region 边界的格式是MD5校验和或任何其他均匀分布的十六进制值的ASCII表示形式。Row是十六进制编码的长值,其范围为“00000000”=>“FFFFFFFF”,并左填充0,以使其在字典上保持与二进制相同的顺序。由于这种分割算法使用十六进制字符串作为键,所以在 shell 中方便读写,但是占用更多的空间,而且可能不够直观。
(3)DecimalStringSplit:rowkey是10进制数字字符串作为前缀的
2.2、表详情
查看表的详细信息:desc 或者 describe
desc "user_info"
describe "user_info"
查看表的数据量
- 1:hbase shell中执行
count ‘tableName’,INTERVAL=>100000 / /适用百万一下的数据量 ,INTERVAL多少条输出一次 - 2:不在shell中执行,在客户端目录下执行
- hbase ‘org.apache.hadoop.hbase.mapreduce.RowCounter’ ‘tableName’//适用大数据量,会执行MR任务查询
2.3、修改表结构:alter
1:添加两个列簇 f2
alter 'user_info', NAME => 'f2'
2:删除一个列簇 f2:
alter 'user_info', NAME => 'f2', METHOD => 'delete'
alter 'user_info', 'delete' => 'f2'
将 user_info 表的 base_info 列簇版本号改为 5
alter 'user_info', NAME => 'base_info', VERSIONS => 5
2.4、清空表:truncate
清空 user 表中的数据
truncate ‘user’
2.5、停用表/启用表:disable 和 enable
首先停用 user 表
disable ‘user’
启用表
enable ‘user’
2.6、删除表:drop
删除表先停用
disable ‘user’
drop ‘user’
3:表的增删改查
help “put/get/scan”查看具体命令使用
3.1:put插入数据
向 user 表中插入信息,row key 为 rk0001,列簇 info 中添加 name 列标示符,值为 zhangsan
put 'user', 'rk0001', 'info:name', 'zhangsan'
3.2:get查询
获取 user 表中 row key 为 rk0001 的所有信息:get ‘user’, ‘rk0001’
获取user表中row key为rk0001,info、data列簇的信息:get ‘user’, ‘rk0001’, {COLUMN => [‘info’, ‘data’]}
获取user表中row key为rk0001,info、data列簇以及包含列的消息:get ‘user’, ‘rk0001’, {COLUMN => [‘info:name’, ‘data:pic’]}
3.3、scan查询
查询 user_info 表中的所有信息
scan ‘user_info’
标准格式
hbase(main):015:0> scan 'hbaseTest'
ROW COLUMN+CELL
001 column=info:age, timestamp=1570716360890, value=18
指定列簇:scan ‘user’, {COLUMNS => ‘info’} 多个列簇用数组形式,逗号分隔
指定列簇以及列:scan ‘user’, {COLUMNS => [‘info:name’, ‘data:pic’]}
以下用过滤器进行操作:
查询user表中row key以rk字符开头的:scan ‘user’,{FILTER=>“PrefixFilter(‘rk’)”}
指定rowkey的区间查询:scan ‘person’, {COLUMNS => ‘info’, STARTROW => ‘rk0001’, ENDROW => 'rk0003
3.4、delete删除数据
delete不能一口气删除一个 rowkey 所对应的所有 列簇
deleteall可以根据列簇删除
指定列簇删除:delete 'user', 'rk0001', 'info'
根据rowkey删除:deleteall 'table','rowkey'
根据时间戳删除:delete 'table', 'rowkey', , timestamp
delete 'testTable','001',1646361691000L
根据时间戳删除可以删除早于客户端的数据。
- 1:delete删除失败总结:
对于插入时数据的timestamp如果大于现在的服务器客户端时间,单纯的使用deleteall ‘table’,'rowkey’和APIDelete delete = new Delete(Bytes.toBytes("900066"))
时删除不了的 - 解决方式:删除时必须制定时间戳:shell
delete 'testTable','001',1646361691000L
或者使用APIDelete delete = new Delete(Bytes.toBytes("001"),1646361691000L);
3.5、修改数据
严格来说,HBase 没有修改数据的显示操作,重复插入就相当于是修改操作
4:过滤器
ColumnPrefixFilter:列前缀过滤器
TimestampsFilter:时间戳过滤器
PageFilter:分页过滤器
MultipleColumnPrefixFilter:复合列前缀过滤器
FamilyFilter:列簇过滤器
RowFilter:行健过滤器
QualifierFilter:列过滤器
ValueFilter:值过滤器
PrefixFilter:rowkey前缀过滤器
查询user表中row key以rk字符开头的:scan ‘user’,{FILTER=>“PrefixFilter(‘rk’)”}
ColumnPaginationFilter
SingleColumnValueFilter
ColumnRangeFilter: