Hbase的学习笔记(2)

​ 在Hbase的学习笔记(1)中 主要是对Hbase相关的理论知识简单说了一点。在Hbase的学习笔记(2)中 主要是学习Hbase简单的增删改查命令。

Hbase的基础shell命令操作

1. 进入Hbase shell命令行窗口

连接虚拟机进入shell命令模式,在bin目录下执行:

./hbse shell

或者,直接输入bin的路径配合shell命令使用,比如我的hbase的bin目录存放的路径为 /usr/hdp/current/hbase-client/bin,那么就可以使用如下命令:

/usr/hdp/current/hbase-client/bin/hbase shell

输入完命令后执行,光标所在行为:

hbase(main):001:0> 

2. 查看所有表

输入list命令,查看当前所有表(我这边显示有两个表是之前有过的表)

hbase(main):001:0> list
TABLE
futuresFunctionBar
selfstock
2 row(s)
Took 1.0300 seconds
=> ["futuresFunctionBar","selfstock"]

3. 创建表

要新建一个表,首先必须要给它起个名字,并为其定义模式,一个表的模式包含表的属性和列族的列表。

eg: 我们想新建一个名为test的表,使其中包含一个名为data的列,表和列族属性都为默认值,则可以使用如下命令:(注意:不区分单引号双引号)

hbase(main):002:0> create 'test','data'
Created table test
Took 5.5800 seconds
=> Hbase::Table - test

如上,“test"是表名;”data“是列族名,可以在创建表时定义一个至多个列族

创建完毕之后可以输入list来查看表是否创建成功:

hbase(main):003:0> list
TABLE
futuresFunctionBar
selfstock
test
3 row(s)
Took 0.0289 seconds
=> ["futuresFunctionBar","selfstock","test"]

4. 插入数据

使用 put 命令 可以用来添加数据或者更新数据:

put命令规范为:

put ’ table ’ , ’ row key ’ , ’ column_family : column ’ , ’ value ’

hbase(main):004:0> put 'test','row1',"data:1","value1"
Took 0.2251 seconds
hbase(main):005:0> put 'test','row2',"data:2","value2"
Took 0.0130 seconds

当然,put 方法类似的还有更多,可以使用 help 'put' 命令查看:

hbase(main):010:0> help "put"
Put a cell 'value' at specified table/row/column and optionally
timestamp coordinates.  To put a cell value into table 'ns1:t1' or 't1'
at row 'r1' under column 'c1' marked with the time 'ts1', do:

  hbase> put 'ns1:t1', 'r1', 'c1', 'value'
  hbase> put 't1', 'r1', 'c1', 'value'
  hbase> put 't1', 'r1', 'c1', 'value', ts1
  hbase> put 't1', 'r1', 'c1', 'value', {ATTRIBUTES=>{'mykey'=>'myvalue'}}
  hbase> put 't1', 'r1', 'c1', 'value', ts1, {ATTRIBUTES=>{'mykey'=>'myvalue'}}
  hbase> put 't1', 'r1', 'c1', 'value', ts1, {VISIBILITY=>'PRIVATE|SECRET'}

The same commands also can be run on a table reference. Suppose you had a reference
t to table 't1', the corresponding command would be:

  hbase> t.put 'r1', 'c1', 'value', ts1, {ATTRIBUTES=>{'mykey'=>'myvalue'}}

5. 读取数据

当我们想获取第二行的数据时,使用 get 命令可以获取数据

hbase(main):006:0> get 'test','row2'
COLUMN           CELL
 data:2           timestamp=1645682739375, value=value2
Took 0.0592 seconds 

同样的,类似的get方法还有别的,用help 'get'命令查看:

hbase(main):011:0> help "get"
Get row or cell contents; pass table name, row, and optionally
a dictionary of column(s), timestamp, timerange and versions. Examples:

  hbase> get 'ns1:t1', 'r1'
  hbase> get 't1', 'r1'
  hbase> get 't1', 'r1', {TIMERANGE => [ts1, ts2]}
  hbase> get 't1', 'r1', {COLUMN => 'c1'}
  hbase> get 't1', 'r1', {COLUMN => ['c1', 'c2', 'c3']}
  hbase> get 't1', 'r1', {COLUMN => 'c1', TIMESTAMP => ts1}
  hbase> get 't1', 'r1', {COLUMN => 'c1', TIMERANGE => [ts1, ts2], VERSIONS => 4}
  hbase> get 't1', 'r1', {COLUMN => 'c1', TIMESTAMP => ts1, VERSIONS => 4}
  hbase> get 't1', 'r1', {FILTER => "ValueFilter(=, 'binary:abc')"}
  hbase> get 't1', 'r1', 'c1'
  hbase> get 't1', 'r1', 'c1', 'c2'
  hbase> get 't1', 'r1', ['c1', 'c2']
  hbase> get 't1', 'r1', {COLUMN => 'c1', ATTRIBUTES => {'mykey'=>'myvalue'}}
  hbase> get 't1', 'r1', {COLUMN => 'c1', AUTHORIZATIONS => ['PRIVATE','SECRET']}
  hbase> get 't1', 'r1', {CONSISTENCY => 'TIMELINE'}
  hbase> get 't1', 'r1', {CONSISTENCY => 'TIMELINE', REGION_REPLICA_ID => 1}

6. 查看表数据

当需要对已知表进行查看所有数据时。使用 scan命令

hbase(main):007:0> scan 'test'
Row            COLUMN+CELL
 row1          column=data:1, timestamp=1645682714578, value=value1
 row2          column=data:2, timestamp=1645682739375, value=value2
2 row(s)
Took 0.2275 seconds

如上是获取整张表的数据,若想取某一列族如 ”column_family_1"下的数据,则其命令规范为:

scan ‘ table ’ , { COLUMN => ’ column_family_1 ’ }

上述规范等同于:

scan ‘ table ’ , { COLUMN => [ ’ column_family_1 ’ ] }

若需要取多列列族下(如 ”column_family_1", ”column_family_2")的数据,则命令规范为:

scan ‘ table ’ , { COLUMN => [ ’ column_family_1 ’ ] , [ ’ column_family_2 ’ ] }

再细致一点,可能需要获取 ’ column_family_1 ’ 列族下,’ column_1 ’ 列的数据:

scan ‘ table ’ , { COLUMN => [ ’ column_family_1 : column_1 ’ ] }

同样的,多列数据可以这样获取:

scan ‘ table ’ , { COLUMN => [ ’ column_family_1 : column_1 ’ , ’ column_family_2 : column_3’ ] }

若要获取 row key 大于等于某key的情况:(STARTROW)

scan ‘ table ’ , { COLUMN => [ ’ column_family_1 : column_1 ’ , ’ column_family_2 : column_3’ ] , STARTROW => ’ key-2 ’ }

同样,获取 row key 小于某key 的情况:(STOPROW)

scan ‘ table ’ , { COLUMN => [ ’ column_family_1 : column_1 ’ , ’ column_family_2 : column_3’ ] , STOPROW => ’ key_2 ’ }

获取两key之间的,如大于等于key_2,小于key_5 :

scan ‘ table ’ , { COLUMN => [ ’ column_family_1 : column_1 ’ , ’ column_family_2 : column_3’ ] , STARTROW => ’ key_2 ’ , STOPROW => ’ key_5 ’ }

需要注意的是关键字 STARTROWSTOPROW 稍有区别,STARTROW 后的 row key 是包含在内,而STOPROW后的 row key 则是不包含的关系,相当于 “左闭右开” 的关系。

使用 scan 命令扫描一张表的数据时,我们常常会限制下输出 row key 条数 :

scan ’ table ’ , { LIMIT => 2 }

虽然上述规范中是 “LIMIT => 2”,但返回的结果不一定是2条,它可能是大于2条的。因为 row key是唯一主键,这个限制的数量是针对主键 rowkey的。所以limit => 2 指的是不超过2种的rowkey 的所有数据。

若想以反序获取两行数据:

scan ’ table ’ , { LIMIT => 2 ,REVERSED => true }

默认情况下,REVERSED => false 是代表数据正序读取,当设置 REVERSED => true 时,代表数据反序读取。

7. 查看表详情

当需要看表的详细信息时,使用 desc 命令 或者使用describe 命令

hbase(main):008:0> desc 'test'
Table test_table is ENABLED                                                
test_table                                                          
COLUMN FAMILIES DESCRIPTION     
{Name => 'data', VERSIONs =>'1', EVICT_BLOCKS_ON_CLOSE =>'false', NEW_VERSION_BEHAVICK_ENCODING => 'NONE', TTL => 'FOREVER', MIN_VERSIONS => '0', REPLICATION_SCOPE => '0',BLOOMFILTER => 'ROW', CACHE_INDEX_ON_WRITE => 'fales', IN_MEMORY => 'false', CACHE_BLOOMS_ON_WRITE => 'false', PREFETCH_BLOCKS_ON_OPEN => 'false', COMPRESSION => 'NONE', BLOCKCACHE => 'true', BLOCKSIZE => '65536'} 
1 row(s)
Took 0.0890 seconds

8. 删除数据

当数据插入不当时,可用delete命令删除

delete ’ table ’ , ’ row key ’ , ’ column_family_1 : column ’

当需要删除整行数据时, 使用 deleteall 命令

hbase(main):009:0> deleteall 'test', 'row1'
Took 0.0187 seconds

删完这一行查看剩下的数据:

hbase(main):010:0> scan 'test'
Row            COLUMN+CELL
 row2          column=data:2, timestamp=1645682739375, value=value2
1 row(s)
Took 0.0148 seconds

若需要删除整张表的数据(表结构还在),可用truncate 命令:

truncate ’ table ’

9. 删除表

当需要将创建好的表删除,比如要删除 ’test’ 这张表,首先我们要把它设为禁用,然后删除。如果直接 drop 表,会报错。

可以发现删除表需要两个步骤:

  • disable table
  • drop table

表创建成功后,默认状态是enable,即“使用中”的状态,删除表之前需要先设置表为“关闭中”。

  • 设置表为“使用中”:enable ‘table'
  • 设置表为”关闭中“:disable 'table'
hbase(main):011:0> disable 'test'
Took 3.9249 seconds
hbase(main):012:0> drop 'test'
Took 2.5588 seconds
hbase(main):013:0> list
TABLE
futuresFunctionBar
selfstock
2 row(s)
Took 1.0300 seconds
=> ["futuresFunctionBar","selfstock"]

10. 统计表数据行数

当需要统计表数据行数时,使用 count 命令:

count ’ table ’

11. 增加列族

alter ‘ table ’ , { NAME => ’ new_column_family ’ , VERSIONS => ’ number ’ }

12. 删除列族

alter ’ table ’ , { NAME => ’ column_family ’ , METHOD => ’ delete ’ }

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐