【Hbase】hbase的shell操作(2)

目录

命令汇总

需求

基本操作

创建表

 查看表

 删除表

禁用表

启用表

数据操作

添加数据

获取(查看)数据

更新(修改)数据

删除数据

删除指定的列

删除整行数据

清空表

数据的导入

数据文件的准备

上传数据文件到服务器

创建表

执行命令导入数据文件

查看数据

计数操作

计数命令

MR程序计算

扫描操作

全表扫描

限定记录数

限定列

限定rowkey

过滤器(FILTER)

简介

过滤器

过滤器的用法

 比较知识

案例一:使用RowFilter查询指定订单id的数据

案例二:查询状态为已付款的订单

案例三:组合多条件过滤

INCR

需求

incr操作

导入测试数据

获取计数器的值命令

使用incr进行累加操作

shell管理操作

status

whoami

list

count

describe

exists

is_enabled、is_disabled

alter

其他


hbase在虚拟机手动操作就是shell操作,与之对应的是在idea或者其他java环境上进行java api操作,但结果都是一样的,都能实现客户需求。

命令汇总

命令

功能

命令

功能

create

创建表

count

统计行数

put

插入或更新数据

delete

删除指定的行或列的数据

get

获取指定行或列的数据

deleteall

删除整个行或者列的数据

scan

扫描表并返回表的数据

truncate

删除表的数据,结构还在

describe

查看表的结构

drop

删除整个表(包括数据和结构)慎用

 

需求

有以下的订单数据,要将其保存在HBase

订单id

订单状态

支付金额

支付方式id

用户id

操作时间

商品分类

001

已付款

200.5

1

1001

2021-3-1 18:01:40

手机

基本操作

创建表

语法:

create ‘表名’,’列簇名1’,’列簇名2’,..

说明:

create要小写

一个表可以包含多个列簇

 查看表

语法:

list

describe ‘表名’

 删除表

 

禁用表

语法:

disable ‘表名’

 

启用表

语法:

enable ‘表名’

 

数据操作

添加数据

语法:

put ‘表名’,’rowkey’,’列簇名:列名’,’值’

 

 

获取(查看)数据

语法:

get ‘表名’,’rowkey’

 

注意:

如果显示中文乱码,是因为hbase shell中显示中文是十六进制编码,要正确显示中文,需要添加选项,格式:

,{'FORMATTER' => 'toString'}

 

更新(修改)数据

语法:

put ‘表名’,’rowkey’,’列簇名:列名’,’新值’

注意

在HBase中会自动维护表中数据的版本

每执行一次put操作,都会生成新的时间戳

 

删除数据

删除指定的列

语法:

delete ‘表名’,’rowkey’,’列簇名:列名’

 

无法用delete

删除一整行

 

删除整行数据

语法:

deleteall ‘表名’,’rowkey’

说明:

HBase删除数据时,其实并不是真的删除,而是给数据做一个删除标志,再查询数据的时候不显示出来。

 

清空表

语法:

truncate ‘表名’

 

数据的导入

数据文件的准备

模拟某系统产生日志数据文件,把这些数据文件导入到hbase中

https://pan.baidu.com/s/1fOK51F-krqJz9tDFzxBr8w?pwd=1234   提取码:1234

这是数据

 

上传数据文件到服务器

 

创建表

 

执行命令导入数据文件

 

查看数据

scan 'ORDER_INFO',{'FORMATTER' => 'toString'}

 

计数操作

统计表中共有多少条记录

计数命令

语法:

count ‘表名’

 

注意:

当数据量很大的时候,这个操作比较耗时

MR程序计算

当数据量很大很大时,可以通过HBase提供的MR程序来运行计数统计。

语法:

hbase org.apache.hadoop.hbase.mapreduce.RowCounter ‘表名’

注意:

启动yarn集群

 启动历史服务器,命令:mapred --daemon start historyserver

 history的web ui

mr得出结果

 

 

扫描操作

全表扫描

语法:

scan ‘表名’,{FORMATTER=>’toString’}

scan "ORDER_INFO",{FORMATTER=>'toString'}

注意:

尽量避免全表扫描一张很大很大的表

 

限定记录数

语法:

scan ‘表名’,{FORMATTER=>'toString',LIMIT=>数字}

scan "ORDER_INFO",{FORMATTER=>'toString',LIMIT=>2}

 

限定列

语法:

scan "ORDER_INFO",{FORMATTER=>'toString',COLUMNS=>[‘列簇名1:列名1’,’列簇名1:列名2’,……]}

scan "ORDER_INFO",{FORMATTER=>'toString',LIMIT=>2,COLUMNS=>['C1:PAYWAY','C1:STATUS']}

 

限定rowkey

 

语法:

scan "ORDER_INFO",{ROWPREFIXFILTER=>’rowkey’}

 

scan "ORDER_INFO",{FORMATTER=>'toString',COLUMNS=>['C1:PAYWAY','C1:STATUS'],ROWPREFIXFILTER=>'0'}

限定rowkey的前不是0

 

过滤器(FILTER)

简介

在HBase中,如果要对海量的数据进行扫描查询,尤其是全表扫描效率很低,可以使用过滤器Filter来提高查询的效率。Filter可以根据主键、列簇、列、版本号(时间戳)等对数据进行过滤查询。

在HBase中,使用过滤器有两种方式,一是在命令行中使用基于jRuby语法的命令选项实现交互式查询,如上所用,另一种是基于JAVA API的方式来进行编程开发。

过滤器

可以通过show_filters命令,来查看HBase内置的过滤器

 

类别

过滤器

功能

rowkey过滤器

RowFilter

实现行键字符串的比较和过滤

PrefixFilter

rowkey前缀过滤器

KeyOnlyFilter

只对单元格的键过滤不显示值

FirstKeyOnlyFilter

只扫描显示相同键的第一个单元格,其键值对会显示出来

列过滤器

FamilyFilter

列簇过滤器

QualifierFilter

列限定符过滤器,只显示对应列簇列名的数据

ColumnPrefixFilter

对列名称的前缀进行过滤

MultipleColumnPrefixFilter

可以指定多个前缀对列名过滤

ColumnRangeFilter

列名称范围过滤器

值过滤器

ValueFilter

值过滤器,找到符合值条件的键值对

SingleColumnValueFilter

在指定的列簇和列名中进行比较的值过滤器

ColumnValueFilter

列值过滤器

SingleColumnValueExcludeFilter

排除匹配成功的值

其他过滤器

ColumnPaginationFilter

对一行的所有列分页,只返回[offset,offset+limit]范围内的列

PageFilter

对显示结果按行进行分页显示

TimestampsFilter

时间戳过滤器,支持等值,可以设置多个时间戳

ColumnCountGetFilter

限制每个逻辑行返回值对的个数,在get方法中使用

DependentColumnFilter

允许用户指定一个参考列或引用列来过滤其他列的过滤器

 

过滤器的用法

过滤器一般结合scan命令来使用,语法:

scan ‘表名’,{FILTER=>”过滤器(比较运算符,’比较器表达式’)”}

举例:

需求一:查询指定订单的数据,订单号为“02602f66-adc7-40d4-8485-76b5632b5b53”

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

 

 比较知识

参考Apache的官网

参考文档:

https://hbase.apache.org/devapidocs/index.html

比较运算符

比较运算符

功能

=

等于

>

大于

<

小于

>=

大于等于

<=

小于等于

!=

不等于

  1. 比较器

比较器

功能

BinaryComparator

匹配完整字节数组

BinaryPrefixComparator

匹配字节数组前缀

BitComparator

匹配比特位

NullComparator

匹配空值

RegexStringComparator

匹配正则表达式

SubStringComparator

匹配子字符串

比较器表达式

比较器

表达式语音缩写

BinaryComparator

binary:值

BinaryPrefixComparator

binaryprefix:值

BitComparator

bit:值

NullComparator

null

RegexStringComparator

regexstring:正则表达式

SubStringComparator

substring:值

案例一:使用RowFilter查询指定订单id的数据

需求:

        查询指定订单的数据,订单号为“02602f66-adc7-40d4-8485-76b5632b5b53”、订单状态及支付方式

分析

  1. 因为订单id就是表的rowkey,所以应该使用rowkey过滤器RowFilter来过滤数据
  2. 比较运算符:=
  3. 比较器表达式:binary:值

命令

scan 'ORDER_INFO',{FORMATTER=>'toString',FILTER=>"RowFilter(=,'binary:02602f66-adc7-40d4-8485-76b5632b5b53')",COLUMNS=>['C1:PAYWAY','C1:STATUS']}

 

 

案例二:查询状态为已付款的订单

需求:

查询状态为已付款的订单

分析

  1. 因为状态为已付款要查询指定值的数据,所以不能使用rowkey过滤器,而是要使用值过滤器
  2. 状态为列名,已付款为值,所以可以选用SingleColumnValueFilter,查看api文档,需要传入四个参数:
    1. 列簇
    2. 列标识符(列名)
    3. 比较运算符
    4. 比较器

 

 

命令:

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

 

 

 

注意:

  1. 列簇名和列名大小写一定要对
  2. 列名写错了过滤不了数据,但是hbase不会报错,因为hbase是无模式的

 

案例三:组合多条件过滤

需求

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

分析

  1. 此处需要使用多个过滤器组合使用共同实现查询的要求,多个过滤器可以使用AND(且)、OR(或者)来进行组合。
  2. 使用值过滤器SingleColumnValueFilter实现对应列值的查询
  3. 支付方式为1的过滤器:

SingleColumnValueFilter('C1','PAYWAY',=,'binary:1')

金额大于3000的过滤器:

SingleColumnValueFilter('C1','PAY_MONEY',>,'binary:3000')

两个过滤器的关系:且用AND来实现

命令

scan 'ORDER_INFO',{FORMATTER=>'toString',FILTER=>"SingleColumnValueFilter('C1','PAYWAY',=,'binary:1') AND SingleColumnValueFilter('C1','PAY_MONEY',>,'binary:3000')",COLUMNS=>['C1:PAYWAY','C1:PAY_MONEY']}

 练习1:支付方式为1,,且金额不大于3000的订单

scan 'ORDER_INFO',{FORMATTER=>'toString',FILTER=>"SingleColumnValueFilter('C1','PAYWAY',=,'binary:1') AND SingleColumnValueFilter('C1','PAY_MONEY',<=,'binary:3000')",COLUMNS=>['C1:PAYWAY','C1:PAY_MONEY']}

 

INCR

incr(increament)可以实现某个单元格的值进行原子性计数,默认累加1

需求

某新闻app应用为了统计每个新闻的每隔一段时间的访问次数,将新闻数据保存在HBase中,该表格的数据如下:

新闻ID

访问次数

时间段

rowkey

0000000001

12

00:00-01:00

0000000001_00:00-01:00

0000000002

20

01:00-02:00

0000000002_01:00-02:00

要求,原子性的增加新闻的访问次数。

incr操作

语法:

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

说明:

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

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

导入测试数据

https://pan.baidu.com/s/1HfVKmsKvCeSiQ3TaUpF7Tw?pwd=1234   提取码:1234

数据集在这

 

 导入hbase

 

显示前5行数据\

scan "NEWS_VISIT_CNT",{FORMATTER=>'toString',LIMIT=>5}

 

获取计数器的值命令

语法:

get_counter,’表名’,’rowkey’,’列簇:列名’

get_counter "NEWS_VISIT_CNT",'0000000001_00:00-01:00','C1:CNT'

 

 

使用incr进行累加操作

 

shell管理操作

status

显示服务器的状态

 

whoami

显示当前用户

 

list

显示当前所有的表

 

count

统计指定表的记录数

 

describe

显示表的结构信息

 

exists

判断某个表是否存,适用于表很多的时候

 

is_enabled、is_disabled

判断表是否启用或禁用

alter

改变表和列簇的模式

其他

disable和enable

禁用和启动表

drop

删除表

truncate

清空表的数据,保留表的结构

hbase shell 操作差不多就是这些了,下一文章(3),将和大家一起学习hbase的java api操作

如遇侵权,请联系删除。

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

星欲冷hx

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值