Hbase Shell 命令和应用案例

一、简介

Hbase是构建在HDFS文件系统之上的利用Hadoop MapReduce来计算处理数据的一种非结构化的数据库,而且它是基于列的而非基于行的模式。

二、Hbase重要概念

Hbase的表结构
Hbase以表的形式来存放数据。表有行和列组成。列划分为若干列族(column family),每个列族下可以有多个普通列。
在这里插入图片描述
表Table
Hbase是用表来存放数据的。
命名空间namespace
namespace命名空间指对一组表的逻辑分组,类似MYSQL中的database。
HBase系统默认定义了两个缺省的namespace:
hbase:系统内建表,包含namespace和meta表
default:用户建表时未指定namespace的表都创建在此
行键 Row Key
行键,每一行的主键列,每行的行键要唯一,行键的值为任意字符串(最大长度是 64KB,实际应用中长度一般为 10-100bytes),在HBase内部,rowKey保存为字节数组byte[]。
行的一次读写是原子操作 (不论一次读写多少列)
区域Region
Table在行的方向上分割为多个Region。
每个Table一开始是只有一个Region的,随着数据的增多会沿着行方向分裂出多个Region。
Region由一个或者多个Store组成,每个Store保存一个column family,每个Store又由一个
MemStore和1到多个StoreFile组成。
Region是Hbase分布式中存储和负载均衡的最小单位。
不同的Region分布到不同的RegionServer上。

列族 column family
一个列族由一个或多个column组成,在创建表的时候必须指定列族,而列不是必须指定。通过"列族名:列族"来表示具体的子列。
存储单元 cell
其实从外观看到的每个单元格其实都是对应多个存储单元,默认是一个单元格对一个存储单元。如果一个单元格有多个存储单元那么这个单元格可以存储多个值。
可以通过version来设置存储单元个数。可以通过roeKey+cloumnFamily + column + timestamp来唯一确定存储单元。
时间戳版本号 timestamp
每个cell都保存着同一份数据的多个版本。版本通过时间戳来索引。
应用程序要避免数据版本冲突,就必须自己生成具有唯一性的时间戳。
为了减少cell版本过多造成的管理成本,hbase有两种版本回收方式。一是保存最近的n个版本,二是保存最近一段时间内的版本。
三、Hbase Shell
1、DDL语句
创建表

# 语法
create '表名', {NAME => '列族名1'}, {NAME => '列族名2'}, {NAME => '列族名3'}
# 此种方式是上上面的简写方式,使用上面方式可以为列族指定更多的属性,如VERSIONS、TTL、BLOCKCACHE、CONFIGURATION等属性
create '表名', '列族名1', '列族名2', '列族名3'

create '表名', {NAME => '列族名1', VERSIONS => 版本号, TTL => 过期时间, BLOCKCACHE => true}

# 示例
create 'tbl_user', 'info', 'detail'
create 't1', {NAME => 'f1', VERSIONS => 1, TTL => 2592000, BLOCKCACHE => true}

修改(添加、删除)表结构Schema alter
添加一个列族

 # 语法 
alter '表名', '列族名'
# 示例
alter 'tbl_user','address'

删除一个列族

# 语法 
alter '表名', {NAME=> '列族名', METHOD=> 'delete'}
# 示例
alter 'tbl_user', {NAME=> 'address', METHOD=> 'delete'}

修改列族的属性

# 修改f1列族的版本为5
alter 't1', NAME => 'f1', VERSIONS => 5

# 修改多个列族,修改f2为内存,版本号为5
alter 't1', 'f1', {NAME => 'f2', IN_MEMORY => true}, {NAME => 'f3', VERSIONS => 5}

# 也可以修改table-scope属性,例如MAX_FILESIZE, READONLY,MEMSTORE_FLUSHSIZE, DEFERRED_LOG_FLUSH等。
# 例如,修改region的最大大小为128MB:
alter 't1', MAX_FILESIZE => '134217728'

异步修改Schema alter_async

alter_async 't1', NAME => 'f1', VERSIONS => 5
# delete the 'f1' column family in table 'ns1:t1'
alter_async 'ns1:t1', NAME => 'f1', METHOD => 'delete'
alter_async 'ns1:t1', 'delete' => 'f1'
# change the max size of a family to 128MB
alter 't1', METHOD => 'table_att', MAX_FILESIZE => '134217728'
alter 't1', {NAME => 'f1'}, {NAME => 'f2', METHOD => 'delete'}

列举所有表
list
启用表enable和禁用表disable
通过enable和disable来启用/禁用这个表,相应的可以通过is_enabled和is_disabled来检查表是否被禁用。

 # 语法
enable '表名'
is_enabled '表名'

disable '表名'
is_disabled '表名'

disable 'tbl_user'
is_disabled 'tbl_user'

enable 'tbl_user'
is_enabled 'tbl_user'

删除表drop
需要先禁用表,然后再删除表,启用的表是不允许删除的

# 语法
disable '表名'
drop '表名'

# 示例
disable 'tbl_user'
drop 'tbl_user'

获取某个表赋值给一个变量 get_table
通过 var = get_table ‘表名’ 赋值给一个变量对象,然后对象.来调用,就像面向对象编程一样,通过对象.方法来调用,这种方式在操作某个表时就不必每次列举表名了。

显示hbase所支持的所有过滤器show_filters
过滤器用于get和scan命令中作为筛选数据的条件,类型关系型数据库中的where的作用
列举命名空间 list_namespace
查看命名空间下的所有表 list_namespace_tables
创建命名空间create_namespace
create_namespace ‘表名’
删除命名空间drop_namespace
drop_namespace ‘命名空间名称’

dml命令
插入或者修改数据put

# 语法
# 当列族中只有一个列时'列族名:列名'使用'列族名'
put '表名', '行键', '列族名', '列值'
put '表名', '行键', '列族名:列名', '列值'

# 示例
# 创建表
create 'tbl_user', 'info', 'detail', 'address'
# 第一行数据
put 'tbl_user', 'mengday', 'info:id', '1'
put 'tbl_user', 'mengday', 'info:name', '张三'
put 'tbl_user', 'mengday', 'info:age', '28'
put 'tbl_user', 'mengday', 'detail:birthday', '1990-06-26'
put 'tbl_user', 'mengday', 'detail:email', 'abc@163.com'
put 'tbl_user', 'mengday', 'detail:create_time', '2019-03-04 14:26:10'
put 'tbl_user', 'mengday', 'address', '上海市'
# 第二行数据
put 'tbl_user', 'vbirdbest', 'info:id', '2'
put 'tbl_user', 'vbirdbest', 'info:name', '李四'
put 'tbl_user', 'vbirdbest', 'info:age', '27'

put 'tbl_user', 'vbirdbest', 'detail:birthday', '1990-06-27'
put 'tbl_user', 'vbirdbest', 'detail:email', 'xxx@gmail.com'
put 'tbl_user', 'vbirdbest', 'detail:create_time', '2019-03-05 14:26:10'

put 'tbl_user', 'vbirdbest', 'address', '北京市'

全表扫描scan

# 语法
scan '表名'
# 示例
scan 'tbl_user'

扫描整个列簇

# 语法
scan '表名', {COLUMN=>'列族名'}

# 示例
scan 'tbl_user', {COLUMN=>'info'}

扫描整个列簇的某个列

# 语法
scan '表名', {COLUMN=>'列族名:列名'}

# 示例
scan 'tbl_user', {COLUMN=>'info:age'}

获取数据get

# 语法
get '表名', '行键'
# 示例
get 'tbl_user', 'mengday'

根据某一行某列族的数据

# 语法
get '表名', '行键', '列族名'
# 示例
get 'tbl_user', 'mengday', 'info'
# 创建表,c1版本为4, 元数据mykey=myvalue
create 't1', {NAME => 'c1', VERSIONS => 4}, METADATA => { 
# 添加列族c2, c3
alter 't1', 'c2', 'c3'


# 出入数据,c1 插入4个版本的值
put 't1', 'r1', 'c1', 'v1'

put 't1', 'r1', 'c1', 'v11'


put 't1', 'r1', 'c1', 'v111'


put 't1', 'r1', 'c1', 'v1111'


# 插入c2、c3的值
put 't1', 'r1', 'c2', 'v2'

put 't1', 'r1', 'c3', 'v3'

# 获取rowKey=r1的一行记录
get 't1', 'r1'

# 获取rowKey=r1并且 1552819392398 <= 时间戳范围 < 1552819398244
get 't1', 'r1', {TIMERANGE => [1552819392398, 1552819398244]}

# 获取指定列的值
get 't1', 'r1', {COLUMN => 'c1'}


# 获取指定列的值,多个值使用数组表示
get 't1', 'r1', {COLUMN => ['c1', 'c2', 'c3']}

# 获取c1的值,获取4个版本的值,默认是按照时间戳降续排序的
get 't1', 'r1', {COLUMN => 'c1', VERSIONS => 4}

# 获取c1的3个版本值
get 't1', 'r1', {COLUMN => 'c1', VERSIONS => 3}

# 获取指定时间戳版本的列
get 't1', 'r1', {COLUMN => 'c1', TIMESTAMP => 1552819376343}

get 't1', 'r1', {COLUMN => 'c1', TIMESTAMP => 1552819376343, VERSIONS => 4}

# 获取rowKey=r1中的值等于v2的所有列
get 't1', 'r1', {FILTER => "ValueFilter(=, 'binary:v2')"}

get 't1', 'r1', {COLUMN => 'c1', ATTRIBUTES => {'mykey'=>'myvalue'}}

删除某个列族中的某个列delete

# 语法
delete '表名', '行键', '列族名:列名'

create 'tbl_test', 'columnFamily1'

put 'tbl_test', 'rowKey1', 'columnFamily1:column1', 'value1'
put 'tbl_test', 'rowKey1', 'columnFamily1:column2', 'value2'

delete 'tbl_test', 'rowKey1', 'columnFamily1:column1'

删除某行数据deleteall

# 语法
deleteall '表名', '行键'
# 示例
deleteall 'tbl_test', 'rowKey1'

查询表中有多少行count

# 语法
count '表名'

# 示例
count 'tbl_user'

计数器get_counter

# 点击量:日、周、月
create 'counters', 'daily', 'weekly', 'monthly'
incr 'counters', '20110101', 'daily:hits', 1
incr 'counters', '20110101', 'daily:hits', 1
get_counter 'counters', '20110101', 'daily:hits'

修饰词
COLUMNS: 查询同一个列族的多个列

# 语法
scan '表名', {COLUMNS => [ '列族名1:列名1', '列族名1:列名2', ...]}
# 示例
scan 'tbl_user', {COLUMNS => [ 'info:id', 'info:age']}

TIMESTAMP 指定时间戳
scan ‘t1’, {COLUMNS => ‘c2’, TIMESTAMP=> 1552819392398}

TIMERANGE表示的是”>=开始时间 and <结束时间“

# 语法
scan '表名',{TIMERANGE=>[timestamp1, timestamp2]}
# 示例
scan 'tbl_user',{TIMERANGE=>[1551938004321, 1551938036450]}

VERSIONS
默认情况下一个列只能存储一个数据,后面如果修改数据就会将原来的覆盖掉,可以通过指定VERSIONS时HBase一列能存储多个值。

create 'tbl_test', 'columnFamily1'
describe 'tbl_test'

# 修改列族版本号
alter 'tbl_test', { NAME=>'columnFamily1', VERSIONS=>3 }

put 'tbl_test', 'rowKey1', 'columnFamily1:column1', 'value1'
put 'tbl_test', 'rowKey1', 'columnFamily1:column1', 'value2'
put 'tbl_test', 'rowKey1', 'columnFamily1:column1', 'value3'

# 默认返回最新的一条数据
get 'tbl_test','rowKey1','columnFamily1:column1'

# 返回3个
get 'tbl_test','rowKey1',{COLUMN=>'columnFamily1:column1', VERSIONS=>3}
# 返回2个
get 'tbl_test','rowKey1',{COLUMN=>'columnFamily1:column1', VERSIONS=>2}

FILTER条件过滤器
过滤器之间可以使用AND、OR连接多个过滤器。
ValueFilter 值过滤器

# 语法:binary 等于某个值
scan '表名', FILTER=>"ValueFilter(=,'binary:列值')"
# 语法 substring:包含某个值
scan '表名', FILTER=>"ValueFilter(=,'substring:列值')"

# 示例
scan 'tbl_user', FILTER=>"ValueFilter(=, 'binary:26')"
scan 'tbl_user', FILTER=>"ValueFilter(=, 'substring:6')"

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值