命令 | 功能 | 命令 | 功能 |
---|---|---|---|
create | 创建表 | count | 统计行数 |
put | 插入或更新数据 | delete | 删除指定的行或列的数据 |
get | 获取指定行或列的数据 | deleteall | 删除整个行或者列的数据 |
scan | 扫描表并返回表的数据 | truncate | 删除表的数据,结构还在 |
describe | 查看表的结构 | drop | 删除整个表(包括数据和结构)慎用 |
有以下订单数据,我们想要将这样的一些数据保存到HBase中。
订单ID | 订单状态 | 支付金额 | 支付方式ID | 用户ID | 操作时间 | 商品分类 |
---|---|---|---|---|---|---|
001 | 已付款 | 200.5 | 1 | 001 | 2020-5-2 18:08:53 | 手机; |
接下来,我们将使用HBase shell来进行以下操作:
语法:
create '表名','列蔟名'...
创建订单表,表名为orders,该表有一个列蔟为info
create 'orders','info';
注意:
https://github.com/apache/hbase/tree/branch-2.1/hbase-shell/src/main/ruby/shell/commands
语法:
list
describe ‘表名’
语法:
disable ‘表名’
语法:
enable ‘表名’
语法:
drop ‘表名’
语法:
put ‘表名’,’rowkey’,’列簇名:列名’,’值’
put 'orders','000001','info:id','001'
语法:
get ‘表名’,’rowkey’
get 'orders','000001'
注意:
在HBase shell中,如果在数据中出现了一些中文,默认HBase shell中显示出来的是十六进制编码。要想将这些编码显示为中文,我们需要在get命令后添加一个属性:
{FORMATTER => 'toString'}
语法:
put ‘表名’,’rowkey’,’列簇名:列名’,’新值’
put 'orders', '000001','info:pay_type',2
语法:
delete ‘表名’,’rowkey’,’列簇名:列名’
注意:此处HBase默认会保存多个时间戳的版本数据,所以这里的delete删除的是最新版本的列数据。
语法:
deleteall ‘表名’,’rowkey’
deleteall 'orders','000001'
说明:
HBase删除数据时,其实并不是真的删除,而是给数据做一个删除标志,再查询数据的时候不显示出来。
语法:
truncate ‘表名’
truncate 'orders'
模拟某系统产生日志数据文件,把这些数据文件导入到hbase中
统计表中共有多少条记录
语法:
count ‘表名’
当数据量很大很大时,可以通过HBase提供的MR程序来运行计数统计。
语法:
hbase org.apache.hadoop.hbase.mapreduce.RowCounter ‘表名’
注意:
hbase org.apache.hadoop.hbase.mapreduce.RowCounter "ORDER_INFO"
语法:
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']}
scan "ORDER_INFO",{ROWPREFIXFILTER=>’rowkey’}
scan "ORDER_INFO",{FORMATTER=>'toString',COLUMNS=>['C1:PAYWAY','C1:STATUS'],ROWPREFIXFILTER=>'0'}
在HBase中,如果要对海量的数据来进行查询,此时基本的操作是比较无力的。此时,需要借助HBase中的高级语法——Filter来进行查询。Filter可以根据列簇、列、版本等条件来对数据进行过滤查询。因为在HBase中,主键、列、版本都是有序存储的,所以借助Filter,可以高效地完成查询。当执行Filter时,HBase会将Filter分发给各个HBase服务器节点来进行查询。
HBase中的过滤器也是基于Java开发的,只不过在Shell中,我们是使用基于JRuby的语法来实现的交互式查询。以下是HBase 2.2的JAVA API文档。
http://hbase.apache.org/2.2/devapidocs/index.html
可以通过show_filters命令,来查看HBase内置的过滤器
Java API官方地址:https://hbase.apache.org/devapidocs/index.html
过滤器一般结合scan命令来使用,语法:
scan ‘表名’,{FILTER=>”过滤器(比较运算符,’比较器表达式’)”}
举例:
需求一:查询指定订单的数据,订单号为“02602f66-adc7-40d4-8485-76b5632b5b53”
scan 'ORDER_INFO',{FORMATTER=>'toString',FILTER=>"RowFilter(=,'binary:02602f66-adc7-40d4-8485-76b5632b5b53')"}
查询指定订单的数据,订单号为“02602f66-adc7-40d4-8485-76b5632b5b53”、订单状态及支付方式
通过上图,可以分析得到,RowFilter过滤器接受两个参数,
scan 'ORDER_INFO',{FORMATTER=>'toString',FILTER=>"RowFilter(=,'binary:02602f66-adc7-40d4-8485-76b5632b5b53')",COLUMNS=>['C1:PAYWAY','C1:STATUS']}
查询状态为已付款的订单
注意:
scan 'ORDER_INFO',{FORMATTER=>'toString',FILTER=>"SingleColumnValueFilter('C1','STATUS',=,'binary:已付款')"}
查询支付方式为1,且金额大于3000的订单
SingleColumnValueFilter('C1', 'PAYWAY', = , 'binary:1')
SingleColumnValueFilter('C1', 'PAY_MONEY', > , 'binary:3000')
scan 'ORDER_INFO', {FILTER => "SingleColumnValueFilter('C1', 'PAYWAY', = , 'binary:1') AND SingleColumnValueFilter('C1', 'PAY_MONEY', > , 'binary:3000')", FORMATTER => 'toString'}
某新闻APP应用为了统计每个新闻的每隔一段时间的访问次数,他们将这些数据保存在HBase中。
该表格数据如下所示:
要求:原子性增加新闻的访问次数值。
incr可以实现对某个单元格的值进行原子性计数。语法如下:
incr ‘表名’,‘rowkey’,‘列蔟:列名’,累加值(默认累加1)
该脚本创建了一个表,名为NEWS_VISIT_CNT,列蔟为C1。并使用incr创建了若干个计数器,每个rowkey为:新闻的编号_时间段。CNT为count的缩写,表示访问的次数。
导入hbase
语法:
get_counter,’表名’,’rowkey’,’列簇:列名’
get_counter "NEWS_VISIT_CNT",'0000000001_00:00-01:00','C1:CNT'
incr 'NEWS_VISIT_CNT','0000000001_00:00-01:00','C1:CNT'
显示当前所有的表
统计指定表的记录数
判断某个表是否存,适用于表很多的时候
改变表和列簇的模式
禁用和启动表
删除一张表,记得在删除表之前必须先禁用
清空表的数据,保留表的结构