前言
我们可以以shell的方式来维护和管理HBase。例如:执行建表语句、执行增删改查操作等等。
过滤器的用法
过滤器一般结合scan命令来使用。打开HBase的JAVA API文档。找到RowFilter的构造器说明,我们来看以下,HBase的过滤器该如何使用。
scan '表名', { Filter => "过滤器(比较运算符, '比较器表达式')” }
比较运算符
| 比较运算符 | 描述 |
|---|---|
| = | 等于 |
| > | 大于 |
| >= | 大于等于 |
| < | 小于 |
| <= | 小于等于 |
| != | 不等于 |
比较器
| 比较器 | 描述 |
|---|---|
| BinaryComparator | 匹配完整字节数组 |
| BinaryPrefixComparator | 匹配字节数组前缀 |
| BitComparator | 匹配比特位 |
| NullComparator | 匹配空值 |
| RegexStringComparator | 匹配正则表达式 |
| SubstringComparator | 匹配子字符串 |
比较器表达式
基本语法:比较器类型:比较器的值
| 比较器 | 表达式语言缩写 |
|---|---|
| BinaryComparator | binary:值 |
| BinaryPrefixComparator | binaryprefix:值 |
| BitComparator | bit:值 |
| NullComparator | null |
| RegexStringComparator | regexstring:正则表达式 |
| SubstringComparator | substring:值 |
需求一:使用RowFilter查询指定订单ID的数据
-
需求
只查询订单的ID为:02602f66-adc7-40d4-8485-76b5632b5b53、订单状态以及支付方式 -
分析
1.因为要订单ID就是ORDER_INFO表的rowkey,所以,我们应该使用rowkey过滤器来过滤
2.通过HBase的JAVA API,找到RowFilter构造器

通过上图,可以分析得到,RowFilter过滤器接受两个参数,op——比较运算符
rowComparator——比较器所以构建该Filter的时候,只需要传入两个参数即可
-
命令
scan 'ORDER_INFO', {FILTER => "RowFilter(=,'binary:02602f66-adc7-40d4-8485-76b5632b5b53')"}
需求二:查询状态为已付款的订单
-
需求
查询状态为「已付款」的订单 -
分析
1.因为此处要指定列来进行查询,所以,我们不再使用rowkey过滤器,而是要使用列过滤器
2.我们要针对指定列和指定值进行过滤,比较适合使用SingleColumnValueFilter过滤器,查看JAVA API

需要传入四个参数:列簇
列标识(列名)
比较运算符
比较器注意:
列名STATUS的大小写一定要对!此处使用的是大写!
列名写错了查不出来数据,但HBase不会报错,因为HBase是无模式的 -
命令
scan 'ORDER_INFO', {FILTER => "SingleColumnValueFilter('C1', 'STATUS', =, 'binary:已付款')", FORMATTER => 'toString'}
需求三:查询支付方式为1,且金额大于3000的订单
-
分析
- 此处需要使用多个过滤器共同来实现查询,多个过滤器,可以使用AND或者OR来组合多个过滤器完成查询
- 使用SingleColumnValueFilter实现对应列的查询
-
命令
- 查询支付方式为1
SingleColumnValueFilter('C1', 'PAYWAY', = , 'binary:1') - 查询金额大于3000的订单
SingleColumnValueFilter('C1', 'PAY_MONEY', > , 'binary:3000') - 组合查询
scan 'ORDER_INFO', {FILTER => "SingleColumnValueFilter('C1', 'PAYWAY', = , 'binary:1') AND SingleColumnValueFilter('C1', 'PAY_MONEY', > , 'binary:3000')", FORMATTER => 'toString'}
- 查询支付方式为1
-
注意:
HBase shell中比较默认都是字符串比较,所以如果是比较数值类型的,会出现不准确的情况。例如:在字符串比较中4000是比100000大的
INCR
-
需求
某新闻APP应用为了统计每个新闻的每隔一段时间的访问次数,他们将这些数据保存在HBase中。
该表格数据如下所示:新闻ID 访问次数 时间段 ROWKEY 0000000001 12 00:00-01:00 0000000001_00:00-01:00 0000000002 12 01:00-02:00 0000000002_01:00-02:00 要求:原子性增加新闻的访问次数值。
-
incr操作简介
incr可以实现对某个单元格的值进行原子性计数。语法如下:
incr '表名','rowkey','列蔟:列名',累加值(默认累加1)- 如果某一列要实现计数功能,必须要使用incr来创建对应的列
- 使用put创建的列是不能实现累加的
-
导入测试数据

该脚本创建了一个表,名为NEWS_VISIT_CNT,列蔟为C1。并使用incr创建了若干个计数器,每个rowkey为:新闻的编号_时间段。CNT为count的缩写,表示访问的次数。
hbase shell /export/software/NEWS_VISIT_CNT.txt scan 'NEWS_VISIT_CNT', {LIMIT => 5, FORMATTER => 'toString'} -
需求一:对0000000020新闻01:00 - 02:00访问计数+1
- 获取0000000020这条新闻在01:00-02:00当前的访问次数
get_counter 'NEWS_VISIT_CNT','0000000020_01:00-02:00','C1:CNT'
此处,如果用get获取到的数据是这样的:
base(main):029:0> get ‘NEWS_VISIT_CNT’,‘0000000020_01:00-02:00’,‘C1:CNT’
COLUMN CELL
C1:CNT timestamp=1599529533072, value=\x00\x00\x00\x00\x00\x00\x00\x06
1 row(s)
Took 0.0243 seconds-
使用incr进行累加
incr 'NEWS_VISIT_CNT','0000000020_01:00-02:00','C1:CNT' -
再次查看新闻当前的访问次数
get_counter 'NEWS_VISIT_CNT','0000000020_01:00-02:00','C1:CNT'
- 获取0000000020这条新闻在01:00-02:00当前的访问次数








![洛谷-P2114 [NOI2014] 起床困难综合症](https://img-blog.csdnimg.cn/img_convert/7edf53c01bf4534d76928418a7f7b6eb.png)


![[GYCTF2020]EasyThinking (ThinkPHP V6.0.0)](https://img-blog.csdnimg.cn/2e9f06245b514ab38ea4936319e11d5a.png)






