HBase提供了一个非常方便的命令行交互工具HBase Shell。通过HBase Shell,HBase可以与MySQL命令行一样创建表、索引,也可以增加、删除和修改数据,同时集群的管理、状态查看等也可以通过HBase Shell实现。
数据定义语言(Data Definition Language,DDL),包括数据库表的创建、修改等语句。
创建表的语句如下:
create 's_behavior', {NAME => 'pc'} , {NAME => 'ph'}
该语句创建了一个s_behavior表,用来存储用户的行为数据,这个表有两个列族,列族pc用来存储用户PC端的用户行为数据,列族ph用来存储用户手机端的用户行为数据。
查看所有表的语句如下:
list
该语句会列出HBase数据库中所有已经创建的表。
查看已创建的表的语句如下:
describe 's_behavior'

虽然在创建表的时候没有指定任何属性,但是HBase默认会给表设置一些属性:
(1)BLOOMFILTER:布隆过滤器。做Scan操作时用来排除待扫描的存储文件,第9章会有详细描述。
(2)IN_MEMORY:数据是否常驻块缓存。一般只有HBase系统的元数据表才会设置为true。
(3)VERSIONS:对这个表HBase应该保留多少个数据版本。HBase对表的数据行可以保留多个数据版本,以时间戳来区分。
(4)KEEP_DELETED_CELLS:保留删除的数据。意味着可以通过Get或者Scan请求获取已经被删除的数据(如果数据删除后经过了一次大合并,那么这些删除的数据也会被清理),只要这行数据的时间戳在查询的时间范围即可。注意,如果需要开启集群间复制,则这个属性必须为true,否则可能导致数据复制失败。
(5)DATA_BLOCK_ENCODING:数据块编码。用类似于压缩算法的编码形式来节省存储空间,主要是针对行键,用时间换空间,默认情况下不启用数据块编码,第9章会有详细描述。
(6)COMPRESSION:压缩方式。HBase提供了多种压缩方式(如Snappy、LZO、gzip等)用来在数据存储到磁盘之前对数据进行压缩,以减少存储空间。第9章也会详细介绍并对比各种压缩方式。
(7)TTL:存活时间(Time To Live),数据的有效时长。超过有效时长的数据在大合并的时候会被删除。
(8)BLOCKSIZE:HBase读取数据的最小单元。设置过大会导致读取很多不需要的数据,过小则会产生更多的索引文件,默认大小为64 KB。
(9)REPLICATION_SCOPE:集群间数据复制的开关。当集群间数据复制配置好后,REPLICATION_SCOPE=1表示开启复制。默认值为0,表示不开启复制。
修改表的模式(schema)之前需要先将表下线,然后执行修改的命令,再上线。下面的代码将s_behavior表修改为开启集群间复制:
disable 's_behavior'
alter 's_behavior',
{NAME=>"cf", REPLICATION_SCOPE=>"1", KEEP_DELETED_CELLS => 'TRUE'}enable 's_behavior'
数据操纵语言(Data Manipulation Language,DML)包括插入、获取、扫描数据的put命令、get命令、scan命令,以及删除数据的delete命令、deleteall命令和truncate命令。
put命令用来插入一行数据到HBase表。
格式:
put ,,<列族:列限定符>,<值>
示例:
hbase(main):004:0> put 's_behavior','12345_1516592489001_1','pc:v','1001'
0 row(s) in 0.2020 secondshbase(main):005:0> put 's_behavior','12345_1516592489001_1','ph:o','1001'
0 row(s) in 0.0050 second
第一条命令插入一条用户PC端行为数据,
第二条命令插入一条用户手机端行为数据。
注意,两条命令行键相同,只是指定了不同的列族,因此实际上两条数据在HBase中逻辑上是同一条数据。之后用该行键可以唯一地定位到这两个列族的数据。
2,get命令
get命令用来根据行键获取HBase表的一条记录。
格式:
get ,
示例:
使用get命令通过行键获取表s_behavior的一行数据,包括这行数据的所有列族:
hbase(main):006:0> get 's_behavior','12345_1516592489001_1'
COLUMN CELL
pc:v timestamp=2022-01-24T19:33:18.352, value=1001
ph:o timestamp=2022-01-24T19:33:35.071, value=1001
2 row(s) in 0.0330 seconds通过给get命令指定时间戳来获取一行数据某个时刻的镜像:
hbase(main):007:0> get 's_behavior','12345_1516592489001_1' , {TIMESTAMP => '1643023998352'}
COLUMN CELL
pc:v timestamp=2022-01-24T19:33:18.352, value=1001
1 row(s) in 0.0120 secondsget命令也支持获取数据的多个版本,但是需要在创建表的语句中指定VERSIONS属性。先修改表支持多个版本,然后用get命令获取多个版本的数据:
hbase(main):008:0> alter 's_behavior',NAME=>'pc',VERSIONS =>3
Updating all regions with the new schema...
1/1 regions updated.
Done.
0 row(s) in 1.9370 secondshbase(main):009:0> put 's_behavior','12345_1516592489001_1','
pc:v','1002'
0 row(s) in 0.0100 secondshbase:010:0> get 's_behavior','12345_1516592489001_1',{COLUMN => 'pc:v',VERSIONS=>2}
COLUMN CELL
pc:v timestamp=2022-01-24T19:49:20.398, value=1002
pc:v timestamp=2022-01-24T19:33:18.352, value=1001
1 row(s)Took 0.0266 seconds
3,scan命令
scan命令用来扫描表的数据。scan命令是HBase数据查询命令中最复杂的命令,需要特别注意查询的数据量,以免由于扫描数据过大导致HBase集群出现响应延迟。
格式:
scan
示例:
使用scan命令来查询表s_behavior中的所有记录:
hbase(main):012:0* scan 's_behavior'
ROW COLUMN+CELL
12345_1516592489001_1 column=pc:v, timestamp=2022-01-24T19:49:20.398, value=1002 12345_1516592489001_1 column=ph:o, timestamp=2022-01-24T19:33:35.071, value=1001
1 row(s) in 0.0120 seconds
(1)获取时间区间内数据
示例:
使用时间区间获取“1643021990187<=时间戳<1643023998353”的数据:
hbase(main):013:0> scan 's_behavior', {TIMERANGE => [1643021990187,1643023998353]}
ROW COLUMN+CELL
12345_1516592489001_1 column=ph:o, timestamp=2022-01-24T19:33:18.352, value=1001
1 row(s) in 0.0190 seconds
(2)获取多个版本数据
示例:
使用VERSIONS参数获取表的两个版本数据:
hbase(main):003:0* scan 's_behavior', {VERSIONS=>2}
ROW COLUMN+CELL
12345_1516592489001_1 column=pc:v, timestamp=2022-01-24T19:49:20.398, value=1002
12345_1516592489001_1 column=pc:v, timestamp=2022-01-24T19:33:18.352, value=1001
12345_1516592489001_1 column=ph:o, timestamp=2022-01-24T19:33:35.071, value=1001
1 row(s) in 0.1200 seconds
(3)获取用户前几行数据
示例:
获取ID为12345的用户的前5行数据:
hbase(main):013:0* scan 's_behavior', {FILTER => "PrefixFilter('12345_')" ,COLUM
NS => ['pc'],LIMIT=>5}ROW COLUMN+CELL
12345_1516592489001_1 column=pc:v, timestamp=1521442781396, value=1002
12345_1516592489001_2 column=pc:v, timestamp=1521442781447, value=1003
12345_1516592489001_3 column=pc:v, timestamp=1521442781471, value=1004
12345_1516592489001_4 column=pc:v, timestamp=1521442781492, value=1005
12345_1516592489001_5 column=pc:v, timestamp=1521442781513, value=1006
5 row(s) in 0.0240 seconds
因为表s_behavior的行键都是以用户ID开头,所以可以使用一个前缀过滤器。注意,需要在用户ID(12345)后面带上下划线,否则会匹配到行键为123450_xxx等类似的数据。
(4)获取某个用户某个时间区间内产生的PC端行为数据
scan命令可以指定扫描开始和结束行键。
示例:
获取ID为12345的用户的某个时间区间内产生的PC端行为数据,使用STARTROW、STOPROW参数指定扫描一个前闭后开的区间,即“STARTROW<=行键 scan 's_behavior', {STARTROW =>
'12345_1516592489001' ,STOPROW=>'12345_15165924890
02' ,COLUMNS => ['pc']}ROW COLUMN+CELL
12345_1516592489001_1 column=pc:v, timestamp=2022-01-24T19:33:35.071, value=1002
12345_1516592489001_2 column=pc:v, timestamp=2022-01-24T19:34:01.012, value=1003
12345_1516592489001_3 column=pc:v, timestamp=2022-01-24T19:34:01.012, value=1004
12345_1516592489001_4 column=pc:v, timestamp=2022-01-24T19:34:02.062, value=1005
12345_1516592489001_5 column=pc:v, timestamp=2022-01-24T19:34:02.076, value=1006
12345_1516592489001_6 column=pc:v, timestamp=2022-01-24T19:34:03.089, value=1007
12345_1516592489001_7 column=pc:v, timestamp=2022-01-24T19:34:04.011, value=1008
12345_1516592489001_8 column=pc:v, timestamp=2022-01-24T19:34:05.171, value=1009
8 row(s) in 0.0320 seconds
(5)获取用户对某种商品的行为数据
示例:
第一条命令查询表s_behavior中列值等于1001的数据,第二条命令查询表s_behavior中列值包含1002的数据:
hbase(main):015:0> scan 's_behavior', FILTER=>"ValueFilter(=,'binary:1001')"
ROW COLUMN+CELL
12345_1516592489001_1 column=pc:v, timestamp=2022-01-24T19:33:18.352, value=1001
12345_1516592489001_1 column=ph:o, timestamp=2022-01-24T19:33:35.071, value=1001
1 row(s) in 0.0430 secondshbase(main):016:0> scan's_behavior',FILTER=>"ValueFilter(=,'substring:1002')"
ROW COLUMN+CELL
12345_1516592489001_1 column=pc:v, timestamp=2022-01-24T19:33:18.352, value=1002
1 row(s) in 0.0200 seconds
(6)获取某个用户行为数据的行键
示例:
获取ID为12345的用户的行为数据行键:
hbase(main):012:0> scan 's_behavior', {FILTER => "PrefixFilter('12345') AND
KeyOnlyFilter()" , LIMIT=>3}ROW COLUMN+CELL
12345_1516592489001_1 column=pc:v, timestamp=2022-01-24T19:49:20.398, value=
12345_1516592489001_1 column=ph:o, timestamp=2022-01-24T19:33:35.071, value=
12345_1516592489001_2 column=pc:v, timestamp=2022-01-24T19:35:32.011, value=
12345_1516592489001_3 column=pc:v, timestamp=2022-01-24T19:35:33.169, value=
3 row(s) in 0.0470 seconds
4,delete命令、deleteall命令和truncate命令
HBase提供了delete、deleteall和truncate命令分别用来删除列、行和表的数据。
(1)delete命令删除某列数据。
格式:
delete '', ', '<列族:列限定符>', '[