(二)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:


版权声明:本文为weixin_43930865原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
THE END
< <上一篇
下一篇>>