【HBase入门】6. 常用 Shell 操作(3)

前言

我们可以以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构造器
    【HBase入门】6. 常用 Shell 操作(3)_第1张图片
    通过上图,可以分析得到,RowFilter过滤器接受两个参数,

    op——比较运算符
    rowComparator——比较器

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

  • 命令
    scan 'ORDER_INFO', {FILTER => "RowFilter(=,'binary:02602f66-adc7-40d4-8485-76b5632b5b53')"}

需求二:查询状态为已付款的订单

  • 需求
    查询状态为「已付款」的订单

  • 分析
    1.因为此处要指定列来进行查询,所以,我们不再使用rowkey过滤器,而是要使用列过滤器
    2.我们要针对指定列和指定值进行过滤,比较适合使用SingleColumnValueFilter过滤器,查看JAVA API
    【HBase入门】6. 常用 Shell 操作(3)_第2张图片
    需要传入四个参数:

    列簇
    列标识(列名)
    比较运算符
    比较器

    注意:
    列名STATUS的大小写一定要对!此处使用的是大写!
    列名写错了查不出来数据,但HBase不会报错,因为HBase是无模式的

  • 命令
    scan 'ORDER_INFO', {FILTER => "SingleColumnValueFilter('C1', 'STATUS', =, 'binary:已付款')", FORMATTER => 'toString'}

需求三:查询支付方式为1,且金额大于3000的订单

  • 分析

    1. 此处需要使用多个过滤器共同来实现查询,多个过滤器,可以使用AND或者OR来组合多个过滤器完成查询
    2. 使用SingleColumnValueFilter实现对应列的查询
  • 命令

    1. 查询支付方式为1
      SingleColumnValueFilter('C1', 'PAYWAY', = , 'binary:1')
    2. 查询金额大于3000的订单
      SingleColumnValueFilter('C1', 'PAY_MONEY', > , 'binary:3000')
    3. 组合查询
      scan 'ORDER_INFO', {FILTER => "SingleColumnValueFilter('C1', 'PAYWAY', = , 'binary:1') AND SingleColumnValueFilter('C1', 'PAY_MONEY', > , 'binary:3000')", FORMATTER => 'toString'}
  • 注意:
    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创建的列是不能实现累加的
  • 导入测试数据
    【HBase入门】6. 常用 Shell 操作(3)_第3张图片
    该脚本创建了一个表,名为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

    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

    1. 使用incr进行累加
      incr 'NEWS_VISIT_CNT','0000000020_01:00-02:00','C1:CNT'

    2. 再次查看新闻当前的访问次数
      get_counter 'NEWS_VISIT_CNT','0000000020_01:00-02:00','C1:CNT'

你可能感兴趣的:(hbase,大数据,hadoop,分布式,数据库)