Hbase Shell 常用操作

help

1
help 'create'

hbase shell 操作

HBase是没有schema的,就是在创建表的时候不需要指定表中有哪些列,只需要指定有多少个列蔟

1
2
# 创建订单表,表名为ORDER_INFO,该表有一个列蔟为C1
create "ORDER_INFO","C1"
1
2
# 查看表
list
1
2
3
4
5
# 删除表
# 1.disable "TableName"
# 2.drop "TableName"
disable "ORDER_INFO"
drop "ORDER_INFO"

增删改查

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
# 添加一条数据
# put '表名','ROWKEY','列蔟名:列名','值'
# 数据示例
# ID STATUS PAY_MONEY PAYWAY USER_ID OPERATION_DATE CATEGORY
# 000001 已提交 4070 1 4944191 2020-04-25 手机
put "ORDER_INFO", "000001", "C1:STATUS", "已提交"
put "ORDER_INFO", "000001", "C1:PAY_MONEY", 4070
put "ORDER_INFO", "000001", "C1:PAYWAY", 1
put "ORDER_INFO", "000001", "C1:USER_ID", "4944191"
put "ORDER_INFO", "000001", "C1:OPERATION_DATE", "2020-04-25"
put "ORDER_INFO", "000001", "C1:CATEGORY", "手机"

# 查询数据
# get 查询一行数据
# get '表名',‘ROWKEY’
get 'ORDER_INFO','000001'

# 正确显示中文
get "ORDER_INFO", "000001", {FORMATTER => 'toString'}

# 显示多版本
get 'cx_table_stu01','20200001',{COLUMNS=>'cf1',VERSIONS=>5}
# 如果只能显示一个版本,查看表结构的version是不是为1
desc 'cx_table_stu01'

# 除了列(COLUMNS)修饰词外HBase还支持
# Limit(限制查询结果行数)
# STARTROW (ROWKEY起始行。会先根据这个key定位到region,再向后扫描)
# STOPROW(结束行)
# TIMERANGE(限定时间戳范围)
# VERSIONS(版本数)
# FILTER(按条件过滤行)

# 更新数据
# put '表名','ROWKEY','列蔟名:列名','更改值'
# 将订单ID为000001的状态,更改为「已付款」
put "ORDER_INFO","000001", "C1:STATUS", "已付款"

# 删除数据
# 删除列
# 如果有多个版本只会删除当前版本
# delete "表名", "ROWKEY", "列蔟名:列名"
# 将订单ID为000001的状态列删除。
delete "ORDER_INFO", "000001", "C1:STATUS"

# 删除行
# deleteall '表名','ROWKEY'
# 将订单ID为000001的信息全部删除(删除所有的列)
deleteall "ORDER_INFO", "000001"

# 增加/删除列族
# 增加
# alter '表名', '列族名'
alter 'Student', 'teacherInfo'

# 删除
# alter '表名', {NAME => '列族名', METHOD => 'delete'}
alter 'Student', {NAME => 'teacherInfo', METHOD => 'delete'}

# 修改表
# alter '表名',{name=>"列族",要修改的内容=>xxx}
alter 'PERSON3',{NAME=>'cf1', VERSIONS=>5}

删除数据的时候,其实 HBase 不是真的直接把数据删除掉,而是给某个列设置一个标志,然后查询数据的时候,有这个标志的数据,就不显示出来
什么时候真正的删除数据呢?

  • 后台进程,专门来执行删除数据的操作

执行 delete 的时候

  • 如果表中的某个列有对一个的几次修改,它会删除最近的一次修改
  • 默认是保存 1 个保存的时间戳
  • 有一个 version 属性

计数器

数据量小/测试环境中计数

1
2
3
# 统计表行数
# count "表名"
count "ORDER_INFO"

count 执行效率非常低,适用于百万级以下的小表 RowCount 统计

数据量大/生成环境中计数

利用 hbase.RowCounter 包执行 MR 任务

  • 启动yarn集群
  • 启动mr-historyserver
1
2
# 在 shell 中执行
hbase org.apache.hadoop.hbase.mapreduce.RowCounter '表名'

扫描操作

scan操作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 全表扫描:scan "表名"(慎用,效率很低)
# 查询订单所有数据
scan "ORDER_INFO", {FORMATTER => 'toString'}

# 只查询列族”cf1”
scan 'cx_table_stu01',{COLUMNS=>'cf1'}
# 只查询列族”cf1”下的”name”信息
scan 'cx_table_stu01',{COLUMNS=>'cf1:name'}

# 限定只显示多少条: scan "表名", {LIMIT => XXX}
# 查询订单数据(只显示3条)
scan "ORDER_INFO", {FORMATTER => 'toString', LIMIT => 3}

# 指定查询某几个列: scan "表名", {LIMIT => XXX, COLUMNS => []}
# 只查询订单状态以及支付方式,并且只展示3条数据
scan "ORDER_INFO", {FORMATTER => 'toString', LIMIT => 3, COLUMNS => ['C1:STATUS', 'C1:PAYWAY']}

# 根据ROWKEY来查询:scan "表名", {LIMIT => XXX, COLUMNS => [], ROWPREFIXFILTER => 'ROWKEY'}
# 使用scan来根据rowkey查询数据,也是查询指定列的数据
scan "ORDER_INFO", {ROWPREFIXFILTER => '02602f66-adc7-40d4-8485-76b5632b5b53',FORMATTER => 'toString', LIMIT => 3, COLUMNS => ['C1:STATUS', 'C1:PAYWAY']}

过滤器

其实在hbase shell中,执行的ruby脚本,背后还是调用hbase提供的Java API

官方文档:https://hbase.apache.org/devapidocs/index.html

使用方法

1
2
3
4
5
# 查看内置过滤器
show_filters

# 示例
scan '表名',{Filter => "过滤器(比较运算符, '比较器表达式')"}
1
2
3
# 使用 RowFilter 查询指定订单ID的数据
# 查询订单的ID为:02602f66-adc7-40d4-8485-76b5632b5b53、订单状态以及支付方式
scan "ORDER_INFO", {FILTER => "RowFilter(=,'binary:02602f66-adc7-40d4-8485-76b5632b5b53')", COLUMNS => ['C1:STATUS', 'C1:PAYWAY'], FORMATTER => 'toString'}

RowFilter

通过上图,可以分析得到,RowFilter过滤器接受两个参数,

  • op——比较运算符

  • rowComparator——比较器

所以构建该Filter的时候,只需要传入两个参数即可

1
2
3
4
5
# 查询状态为「已付款」的订单
scan "ORDER_INFO",{FILTER => "SingleColumnValueFilter('C1', 'STATUS', = , 'binary:已付款')",COLUMNS => ['C1:STATUS','C1:PAYWAY'],FORMATTER => 'toString'}

# 查询支付方式为1,且金额大于3000的订单
scan "ORDER_INFO",{FILTER => "SingleColumnValueFilter('C1', 'PAYWAY', = , 'binary:1') AND SingleColumnValueFilter('C1', 'PAY_MONEY', > , 'binary:3000')",COLUMNS => ['C1:STATUS','C1:PAYWAY','C1:PAY_MONEY'],FORMATTER => 'toString'}

HBase shell中比较默认都是字符串比较,所以如果是比较数值类型的,会出现不准确的情况

例如:在字符串比较中4000是比100000大的

rowkey 过滤器

RowFilter 实现行键字符串的比较和过滤
PrefixFilter rowkey前缀过滤器
KeyOnlyFilter 只对单元格的键进行过滤和显示,不显示值
FirstKeyOnlyFilter 只扫描显示相同键的第一个单元格,其键值对会显示出来
InclusiveStopFilter 替代 ENDROW 返回终止条件行

列过滤器

FamilyFilter 列簇过滤器
QualifierFilter 列标识过滤器,只显示对应列名的数据
ColumnPrefixFilter 对列名称的前缀进行过滤
MultipleColumnPrefixFilter 可以指定多个前缀对列名称过滤
ColumnRangeFilter 过滤列名称的范围

值过滤器

ValueFilter 值过滤器,找到符合值条件的键值对
SingleColumnValueFilter 在指定的列蔟和列中进行比较的值过滤器
SingleColumnValueExcludeFilter 排除匹配成功的值

其他过滤器

ColumnPaginationFilter 对一行的所有列分页,只返回 [offset,offset+limit] 范围内的列
PageFilter 对显示结果按行进行分页显示
TimestampsFilter 时间戳过滤,支持等值,可以设置多个时间戳
ColumnCountGetFilter 限制每个逻辑行返回键值对的个数,在 get 方法中使用
DependentColumnFilter 允许用户指定一个参考列或引用列来过滤其他列的过滤器

比较器

比较器 描述
BinaryComparator 匹配完整字节数组
BinaryPrefixComparator 匹配字节数组前缀
BitComparator 匹配比特位
NullComparator 匹配空值
RegexStringComparator 匹配正则表达式
SubstringComparator 匹配子字符串

比较器表达式

比较器 表达式语言缩写
BinaryComparator binary:值
BinaryPrefixComparator binaryprefix:值
BitComparator bit:值
NullComparator null
RegexStringComparator regexstring:正则表达式
SubstringComparator substring:值

累加器(INCR)

incr可以实现对某个单元格的值进行原子性计数。语法如下:

incr ‘表名’,’rowkey’,’列蔟:列名’,累加值(默认累加1)

如果某一列要实现计数功能,必须要使用incr来创建对应的列

使用put创建的列是不能实现累加的

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 通过 scan/get 无法直接查看cnt
hbase(main):004:0> scan "NEWS_VISIT_CNT", {FORMATTER => 'toString', LIMIT => 3}
ROW COLUMN+CELL
0000000001_00:00-01:00 column=C1:CNT, timestamp=2021-11-19T23:12:42.890, value=

0000000001_00:00-01:00 column=C1:TIME_RANGE, timestamp=2021-11-19T23:12:43.153, value=00:00-01:00
0000000002_01:00-02:00 column=C1:CNT, timestamp=2021-11-19T23:12:42.907, value=

0000000002_01:00-02:00 column=C1:TIME_RANGE, timestamp=2021-11-19T23:12:43.165, value=01:00-02:00
0000000003_02:00-03:00 column=C1:CNT, timestamp=2021-11-19T23:12:42.912, value={
0000000003_02:00-03:00 column=C1:TIME_RANGE, timestamp=2021-11-19T23:12:43.171, value=02:00-03:00
3 row(s)
Took 0.1625 seconds
# 需要使用 get_counter
# get_counter '表','ROWKEY',"列蔟名:列名"
get_counter 'NEWS_VISIT_CNT','0000000020_01:00-02:00','C1:CNT'
1
2
3
# 对0000000020新闻01:00 - 02:00访问计数+1
# incr '表','ROWKEY',"列蔟名:列名"
incr 'NEWS_VISIT_CNT','0000000020_01:00-02:00','C1:CNT'

实用命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# 显示服务器状态
status

# 显示HBase当前用户
whoami

# 查看表结构
describe 'TableName'

# 查看表是否存在
exists 'TableName'

# 查看表是否禁用/启用
is_enabled 'TableName'
is_disabled 'TableName'

# 新增列蔟
alter 'TableName', 'C3'
# 删除列蔟
alter 'TableName', 'delete' => 'C3'

# 清空表数据
truncate 'TableName'

执行 hbase shell 脚本

1
2
# hbase shell 'script file path'
hbase shell ~/ORDER_INFO.txt

tips

web默认端口16010

作者

MisakaWater

发布于

2022-01-23

更新于

2022-01-23

许可协议