HBase笔记
1.HBase是典型的 NoSQL数据库,即我们常说的非关心型数据库
2.命名空间
(1)命名空间namespace指的是一个表的逻辑分组,同一组中的表有类似的用途。
(2)表和命名空间的隶属关系在在创建表时决定,通过以下格式指定:
<namespace> : <table>
当为一张表指定命名空间之后,对表的操作都要加命名空间,否则会找不到表。
(3)命名空间相关shell操作1)创建一个命名空间
image.png
2)根据命名空间创建表
image.png
此时命名空间namespace应该存在,否则报错。
3)展示某命名空间下有多少表
image.pngPS:相关资料参考:https://blog.csdn.net/weixin_40040107/article/details/97963801
3.HBase表操作
(1)创建表(create命令)
HBase 使用 create 命令来创建表,创建表时需要指明表名和列族名
create 'Student','StuInfo','Grades'
这条命令仓建了名为 Student 的表,表中包含两个列族,分别为 Stulnfo 和 Grades。
注意在 HBase Shell 语法中,所有字符串参数都必须包含在单引号中,且区分大小写,如 Student 和 student 代表两个不同的表。
另外,在上条命令中没有对列族参数进行定义,因此使用的都是默认参数,如果建表时要设置列族的参数,参考以下方式:
create 'Student', {NAME => 'Stulnfo', VERSIONS => 3}, {NAME =>'Grades', BLOCKCACHE => true}
大括号内是对列族的定义,NAME、VERSION 和 BLOCKCACHE 是参数名,无须使用单引号,符号=>表示将后面的值赋给指定参数。例如,VERSIONS => 3
是指此单元格内的数据可以保留最近的 3 个版本,BLOCKCACHE => true
指允许读取数据时进行缓存。
(2)修改表(alter命令)修改列族
首先修改列族的参数信息,如修改列族的版本。例如上面的 Student 表,假设它的列族 Grades 的 VERSIONS 为 1,但是实际可能需要保存最近的 3 个版本,可使用以下命令完成:
alter 'Student', {NAME => 'Grades', VERSIONS => 3}
修改多个列族的参数,形式与create 命令
类似。
这里要注意,修改已存有数据的列族属性时,HBase 需要对列族里所有的数据进行修改,如果数据量很大,则修改可能要占很长时间。增加列族
如果需要在 Student 表中新增一个列族 hobby,使用以下命令:
alter 'Student', 'hobby'
删除列族
如果要移除或者删除已有的列族,以下两条命令均可完成:
alter 'Student', { NAME => 'hobby', METHOD => 'delete' }
alter 'Student', 'delete' => 'hobby'
另外,HBase 表至少要包含一个列族,因此当表中只有一个列族时,无法将其删除。
(3)删除表(disable和drop命令)
HBase使用 drop 命令删除表,但是在删除表之前需要先使用 disable 命令禁用表。
disable 'Student'
drop 'Student'
使用 disable 禁用表以后,可以使用 is_disable 查看表是否禁用成功。
另外,如果只是想清空表中的所有数据,使用 truncate 命令即可,此命令相当于完成禁用表、删除表,并按原结构重新建立表操作:
truncate 'Student'
(4)插入数据(put命令)
HBase 使用 put 命令向数据表中插入数据,put 向表中增加一个新行数据,或覆盖指定行的数据。
put 'Student', '0001', 'Stulnfo:Name', 'Tom Green', 1
在上述命令中:
- 第一个参数Student为表名;
- 第二个参数0001为行键的名称,为字符串类型;
- 第三个参数StuInfo:Name为列族和列的名称,中间用冒号隔开。列族名必须是已经创建的,否则 HBase 会报错;列名是临时定义的,因此列族里的列是可以随意扩展的;
- 第四个参数Tom Green为单元格的值。在 HBase 里,所有数据都是字符串的形式;
- 最后一个参数1为时间戳,如果不设置时间戳,则系统会自动插入当前时间为时间戳。
image.png
注意,put 命令只能插入一个单元格的数据,上表中的一行数据需要通过以下几条命令一起完成:
put 'Student', '0001', 'StuInfo:Name', 'Tom Green', 1
put 'Student', '0001', 'StuInfo:Age', '18'
put 'Student', '0001', 'StuInfo:Sex', 'Male'
put 'Student', '0001', 'Grades:BigData', '80'
put 'Student', '0001', 'Grades:Computer', '90'
put 'Student', '0001', 'Grades:Math', '85'
如果 put 语句中的单元格是已经存在的,即行键、列族及列名都已经存在,且不考虑时间戳的情况下,执行 put 语句,则可对数据进行更新操作。
如以下命令可将行键为 0001 的学生姓名改为 Jim Green:
put 'Student', '0001', 'Stulnfo:Name', 'Jim Green'
如果在初始创建表时,已经设定了列族 VERSIONS 参数值为 n,则 put 操作可以保存 n 个版本数据,即可查询到行键为 0001 的学生的 n 个版本的姓名数据。
(5)删除数据(delete命令)
执行以下命令,将删除 Student 表中行键为 0002 的 Grades 列族的所有数据:
delete 'Student', '0002', 'Grades'
需要注意的是,delete 操作并不会马上删除数据,只会将对应的数据打上删除标记(tombstone),只有在合并数据时,数据才会被删除。
另外,delete 命令的最小粒度是单元格(Cell)。例如,执行以下命令将删除 Student 表中行键为 0001,Grades 列族成员为 Math,时间戳小于等于 2 的数据:
delete 'Student', '0001', 'Grades:Math', 2
delete 命令不能跨列族操作,如需删除表中所有列族在某一行上的数据,即删除上表中一个逻辑行,则需要使用 deleteall 命令,如下所示,不需要指定列族和列的名称:
deleteall 'Student', '0001'
(6)获取数据(get 命令)
image.png
对于上面的数据表,执行以下命令可以获取 Student 表中行键为 0001 的所有列族数据:
get 'student', '0001'
(7)查询全表数据(scan命令)
scan 'Student'