HBase shell 介绍


1.DDL(data definition language)

DDL的命令有CREATE、ALTER、DROP等,DDL主要是用在定义或改变表(TABLE)的结构,数据类型,表之间的链接和约束等初始化工作上,他们大多在建立表时使用

1.1一般操作

1.1.1 查看HBASE版本:version

hbase(main):019:0> version
2.0.2.3.1.0.0-78, r, Thu Dec  6 12:27:45 UTC 2018
Took 0.0005 seconds

1.1.2 查看HBASE状态:status

hbase(main):022:0* status
1 active master, 0 backup masters, 3 servers, 0 dead, 282.3333 average load
Took 0.2577 seconds

1.1.3 查看当前用户:whoami

hbase(main):026:0* whoami
root (auth:SIMPLE)
    groups: root
Took 0.0293 seconds

1.2 表空间操作

在HBASE中,namespace命名空间指对一组表进行逻辑分组,类似于关系型数据库中的database,方便对表在业务上划分。Apache HBASE 从0.98、0.95.2两个版本开始支持namespace级别的授权操作,HBASE全局管理员可以创建、修改和回收namespace的授权。
HBASE系统默认定义了两个默认的namespace:

  • hbase:系统内建表,包括namespace 和 meta表。
  • default:当用户建表时未指定namespace,那么会在该namespace下创建表。

1.2.1 列出表空间:list_namespace

hbase(main):029:0> list_namespace
NAMESPACE
SYSTEM
default
hbase
3 row(s)
Took 0.0559 seconds

1.2.2 新建表空间:create_namespace

  • 语法:create_namespace ‘表空间名称’
hbase(main):035:0> create_namespace 'test'
Took 0.9737 seconds
hbase(main):036:0* list_namespace
NAMESPACE
SYSTEM
default
hbase
test
4 row(s)
Took 0.0228 seconds

1.2.3 查看表空间:describe_namespace

  • 语法:describe_namespace ‘表空间名称’
hbase(main):039:0> describe_namespace 'test'
DESCRIPTION
{NAME => 'test'}
Took 0.0150 seconds
=> 1

1.2.4 在表空间下创建表:

  • 语法:create ‘表空间名称:表名称’,’列簇名’
hbase(main):060:0* create 'test:t1','info'
Created table test:t1
Took 4.4217 seconds
=> Hbase::Table - test:t1

1.2.5 查看表空间下的表:list_namespace_tables

  • 语法:list_namespace_tables ‘表空间名称’
hbase(main):064:0* list_namespace_tables 'test'
TABLE
t1
1 row(s)
Took 0.0088 seconds
=> ["t1"]

1.2.6 删除表空间:drop_namespace

  • 语法:drop_namespace ‘表空间名称’
hbase(main):068:0* drop_namespace 'test'

ERROR: org.apache.hadoop.hbase.constraint.ConstraintException: 
Only empty namespaces can be removed. Namespace test has 1 tables
    ......

Drop the named namespace. The namespace must be empty.

Took 0.3069 seconds
'注意删除表空间之前需要删除表空间内的所有表'

hbase(main):069:0> disable 'test:t1' #停用表
Took 2.4207 seconds
hbase(main):070:0> drop 'test:t1' #删除表
Took 1.4083 seconds
hbase(main):071:0>
hbase(main):072:0* drop_namespace 'test' #删除表空间
Took 1.4310 seconds
hbase(main):074:0> list_namespace
NAMESPACE
SYSTEM
default
hbase
3 row(s)
Took 0.0251 seconds

1.3 表的相关操作

1.3.1 列出所有的表:list

hbase(main):085:0* list
TABLE
SYSTEM:CATALOG
SYSTEM:FUNCTION
SYSTEM:LOG
SYSTEM:MUTEX
SYSTEM:SEQUENCE
SYSTEM:STATS
Student
7 row(s)
Took 0.0193 seconds
=> ["SYSTEM:CATALOG", "SYSTEM:FUNCTION", "SYSTEM:LOG", "SYSTEM:MUTEX", "SYSTEM:SEQUENCE", "SYSTEM:STATS", "Student"]

1.3.2 检查某个表是否存在:exists

  • 语法:exists ‘表名’
hbase(main):089:0> exists 'Student'
Table Student does exist
Took 0.0177 seconds
=> true
hbase(main):090:0> exists 'Student2'
Table Student2 does not exist
Took 0.0035 seconds
=> false

1.3.3 使用默认配置建表

  • 语法:create ‘空间名:表名’,’列簇名’/create ‘表名’,’列簇名’
    空间名非必须,如果建表时不写表空间则新建表在默认表空间中
'创建一张表 t1 有两个列簇 cf1、cf2'
hbase(main):091:0> create 't1','cf1','cf2'
Created table t1
Took 2.4765 seconds
=> Hbase::Table - t1

1.3.4 查看表结构 describe

  • 语法:describe ‘表名’
hbase(main):095:0> describe 't1'
Table t1 is ENABLED
t1
COLUMN FAMILIES DESCRIPTION
{NAME => 'cf1', VERSIONS => '1', EVICT_BLOCKS_ON_CLOSE => 'false', NEW_VERSION_BEHAVIOR => 'false', KEEP_DELETED_CELLS => 'FALSE', CACHE_DATA_ON_WRITE => 'false', DATA_BLOCK_ENCODING => 'NONE', TTL => 'FOREVER', MIN_VERSIONS => '0', REPLI
CATION_SCOPE => '0', BLOOMFILTER => 'ROW', CACHE_INDEX_ON_WRITE => 'false', IN_MEMORY => 'false', CACHE_BLOOMS_ON_WRITE => 'false', PREFETCH_BLOCKS_ON_OPEN => 'false', COMPRESSION => 'NONE', BLOCKCACHE => 'true', BLOCKSIZE => '65536'}
{NAME => 'cf2', VERSIONS => '1', EVICT_BLOCKS_ON_CLOSE => 'false', NEW_VERSION_BEHAVIOR => 'false', KEEP_DELETED_CELLS => 'FALSE', CACHE_DATA_ON_WRITE => 'false', DATA_BLOCK_ENCODING => 'NONE', TTL => 'FOREVER', MIN_VERSIONS => '0', REPLI
CATION_SCOPE => '0', BLOOMFILTER => 'ROW', CACHE_INDEX_ON_WRITE => 'false', IN_MEMORY => 'false', CACHE_BLOOMS_ON_WRITE => 'false', PREFETCH_BLOCKS_ON_OPEN => 'false', COMPRESSION => 'NONE', BLOCKCACHE => 'true', BLOCKSIZE => '65536'}
2 row(s)
Took 0.0274 seconds

表结构说明:

Table t1 is ENABLED –> 表是可用状态
t1
COLUMN FAMILIES DESCRIPTION –> 以下是列簇描述
{
NAME => ‘cf1’, –> 列簇名称
VERSIONS => ‘1’, –> 版本数量
EVICT_BLOCKS_ON_CLOSE => ‘false’, –> 在关闭时是否移除缓存块
NEW_VERSION_BEHAVIOR => ‘false’, –> 来指定备用版本并删除处理
KEEP_DELETED_CELLS => ‘FALSE’, –>在major compaction发生的时候,决定要不要清理旧数据
CACHE_DATA_ON_WRITE => ‘false’, –> 如果块缓存开启,那么默认是否在写入数据时缓存数据块
CACHE_INDEX_ON_WRITE => ‘false’, –>如果块缓存开启,那么默认是否在写入数据时缓存index
DATA_BLOCK_ENCODING => ‘NONE’, –> 设置数据块编码方式
TTL => ‘FOREVER’, –> 数据有效时间,时间单位秒
MIN_VERSIONS => ‘0’, –> 在compact操作执行之后,至少要保留的版本数
REPLICATION_SCOPE => ‘0’, –> 配置HBase集群replication时需要将该参数设置为1
BLOOMFILTER => ‘ROW’, –>布隆过滤器的作用级别
IN_MEMORY => ‘false’, –> 设置激进缓存,优先考虑将该列族放入块缓存中,默认值为false, 针对随机读操作相对较多的列族可以设置该属性为true
CACHE_BLOOMS_ON_WRITE => ‘false’, –> 当缓存数据块开启的时候是否缓存 布隆过滤器数据
PREFETCH_BLOCKS_ON_OPEN => ‘false’, –>预先加载数据,如果设置,则在打开文件后,属于该列簇的HFiles的所有INDEX,BLOOM和DATA块都将被加载到缓存中
COMPRESSION => ‘NONE’, –> 压缩算法
BLOCKCACHE => ‘true’, –> #设置数据块是否缓存,默认为true
BLOCKSIZE => ‘65536’–> 设置HFile数据块大小,单位 B,默认64kb
}

1.3.5 停用表 disable

  • 语法:disable ‘表名’
disable 't1'

1.3.6 启用表 enable

  • 语法:enable ‘表名’
enable 't1'

1.3.7 创建表2->对TTL、缓存、压缩等配置

  • 语法:create ‘表名’,{NAME => ‘info’, 配置名称=>’值’,配置名称=>’值’,…}
    如下语句,创建表名为t1的表,并创建两个列簇 info 和header,并设置数据有效时间为604800秒(7天),使用SNAPPY压缩算法,只有一个版本,开启块缓存。
create 't1',
{NAME => 'info', TTL=>'604800',COMPRESSION => 'SNAPPY',VERSIONS => 1,BLOCKCACHE => true},
{NAME => 'header', TTL=>'604800',COMPRESSION => 'SNAPPY',VERSIONS => 1,BLOCKCACHE => true}

1.3.8 创建表3->对region进行预分区1.命令行中进行分区

  • 语法:create ‘表名’,列簇,SPLITS =>[‘分区前缀|’,’分区前缀|’,…]

创建表并对region分配3个预分区

create 't2','info',SPLITS =>['100|','101|','102|']

region预分区

1.3.9 创建表3->对region进行预分区1.配置文件中进行分区

1.3.10 增加/删除列簇

  • 语法:alter ‘表名’,’delete’=>’列簇名称’

增加一个列簇 f1,并且删除header列簇

alter 't2',{NAME=>'f1'},'delete'=>'header'

1.3.11 修改info列簇版本号

将t2表的info列族版本号改为5

alter 't2',NAME=>'info',VERSIONS=>5

修改表其他配置项语法类似

1.3.12 修改压缩格式

  • 语法:alter ‘表名’, NAME => ‘列簇名’, COMPRESSION => ‘压缩算法’
#停用表
disable 't2'
#设置压缩格式
alter 't2', NAME => 'info', COMPRESSION => 'snappy'
启用表
enable 't2'
#将原有数据压缩
major_compact 't2'

1.3.13 删除表

  • 语法:drop ‘表名’
disable 't2'
drop 't2'

2. DML(data manipulation language)

它们是SELECT、UPDATE、INSERT、DELETE,就象它的名字一样,这4条命令是用来对数据库里的数据进行操作的语言

2.1 增加数据

  • 语法:put ‘表名’,’row key’,’列族名:列名’,’值’
#创建一个新表,有cf1、cf2两个列簇
create 't3',{NAME=>'cf1',VERSIONS=>3},{NAME=>'cf2',VERSIONS=>3}

#添加一行数据
put 't3','101','cf1:name','xiaoming'

#向101 这行数据增加一个列
put 't3','101','cf1:age','17'

#再添加一些测试数据
put 't3','101','cf1:gender','male'
put 't3','101','cf2:phone_number','13522886092'
put 't3','101','cf2:address','hebei'

put 't3','102','cf1:name','xiaohong'
put 't3','102','cf1:age','20'
put 't3','102','cf1:gender','female'
put 't3','102','cf2:phone_number','18201607321'
put 't3','102','cf2:address','henan'

put 't3','103','cf1:name','liming'
put 't3','103','cf1:age','25'
put 't3','103','cf1:gender','male'
put 't3','103','cf2:phone_number','15313089839'
put 't3','103','cf2:address','hebei'

put 't3','104','cf1:name','ligang' 
put 't3','104','cf1:age','19'
put 't3','104','cf1:gender','male'
put 't3','104','cf2:phone_number','13872232462'
put 't3','104','cf2:address','shandong'

put 't3','105','cf1:name','liyue'
put 't3','105','cf1:age','18'
put 't3','105','cf1:gender','female'
put 't3','105','cf2:phone_number','15801019898'
put 't3','105','cf2:address','shanxi'

#修改 105 数据 测试多版本
put 't3','105','cf1:age','19'
put 't3','105','cf1:age','20'
put 't3','105','cf2:phone_number','15801019899'
put 't3','105','cf2:phone_number','15801019897'

2.2 查询数据

2.2.1 使用 get 查询数据

  • 语法:get ‘表名’,’rowkey’,’列簇’,’过滤器’
# 查询 rowkey 为101行的所有数据
get 't3','101'

# 查询 rowkey 为101行的cf1 列簇所有数据
get 't3','101','cf1' 

# 查询 rowkey 为101行的 cf1 和 cf2 列簇所有数据
get 't3','101','cf1','cf2'
或者
get 't3','105',{COLUMN => ['cf1','cf2']}

# 查询 rowkey 为105行的 cf1 列簇中的name数据
get 't3','105',{COLUMN => ['cf1:name']}

# 查询 rowkey 为105行的 cf1 列簇中的name 和 cf2 列簇中 address 数据
get 't3','105',{COLUMN => ['cf1:name','cf2:address']}

# 查询 t3 表中 rowkey 为 105 ,列族为cf1,版本号最新2个的信息
get 't3','105',{COLUMN => 'cf1',VERSIONS =>2}

# 查询 t3 表中 rowkey 为 105 ,列族为cf1中 age 列,版本号最新2个的信息
get 't3','105',{COLUMN => 'cf1:age',VERSIONS =>2}

# 查询某个时间戳范围内的最新2个版本,判断条件为
#语法:get '表名',{TIMERANGE =>[开始时间,结束时间]} // 查询判断条件为大于开始时间,小于结束时间,不包含等于情况
get 't3','105',{COLUMN => 'cf1:age',VERSIONS =>5,TIMERANGE =>[1564388747953,1564390128807]}

# 使用列值过滤器查询数据 查询列值为"hebei"的列
#语法:get '表名','rowkey',{COLUMN => '列簇',FILTER => "过滤器名(比较符,'比较器:h值')"}
get 't3','101',{COLUMN => 'cf1',FILTER => "ValueFilter(=,'binary:hebei')"}

#使用列明过滤器查询数据 查询列名为"name"的列
get 't3','101',{FILTER => "(QualifierFilter(=,'substring:name'))"}

2.2.2 使用 scan 查询数据

#查询 t3 表中的所有信息
scan 't3'

#查询 t3 表中列族为cf1的信息
scan 't3' ,{COLUMNS  => 'cf1'}

#scan 查询设置起止rowkey
scan 't3',STARTROW=>'20191109000000',STOPROW=>'20191113090000',LIMIT=>1

#查找最新的数据
scan 't3',{REVERSED=>true,LIMIT=>1}

#查询 t3 表中列族为cf1和cf2的信息
scan 't3',{COLUMNS =>['cf1','cf2']}

#查询 t3 表中列族为cf1,标识符为name的信息
scan 't3',{COLUMNS =>'cf1:name'}

#查询 t3 表中 cf1列簇中name 和 cf2列簇中 address的数据
scan 't3',{COLUMNS =>['cf1:name','cf2:address']}

#查询user 表中列族为cf1、列标识符为age的信息,并且版本最新的5个
scan 't3',{COLUMNS => 'cf1:age',VERSIONS => 5}

#查询 t3 表中指定范围的数据 开始时间 < 数据时间戳 < 结束时间
scan 't3',{TIMERANGE  => [1564388263678, 1564390129420]}

#查询 t3 表中列族为 cf1,rk范围是[rk001,rk003)的数据
scan 't3', {COLUMNS => 'cf1', STARTROW => '101', ENDROW => '103'}

#查询 t3 表中列族为cf1和cf2且列明中含有a字符的信息
scan 't3',{COLUMNS =>['cf1','cf2'],FILTER  => "(QualifierFilter(=,'substring:a'))"}

#查询 t3 表中rowkey以101字符开头的
scan 't3',{FILTER=>"PrefixFilter('101')"}

#查询 t3 表 在起止时间戳区间的数据 ,开始时间 < 数据时间戳 < 结束时间
scan 't3', {COLUMNS => 'cf1:name', TIMERANGE => [1564388263678, 1564388272002]}

# 查询数据历史版本
scan 't3',{COLUMNS => 'cf1:age',RAW =>false,VERSIONS =>5}

#查询t3 表中前2条数据
scan 't3',{LIMIT=>2}

#查询指定范围内 18岁以下的信息
import org.apache.hadoop.hbase.filter.CompareFilter
import org.apache.hadoop.hbase.filter.SingleColumnValueFilter
import org.apache.hadoop.hbase.filter.SubstringComparator
import org.apache.hadoop.hbase.filter.BinaryComparator
import org.apache.hadoop.hbase.util.Bytes

scan 't3',STARTROW=>'20191109000000',STOPROW=>'20191113090000',
COLUMNS=>['cf1:age'],
FILTER=>SingleColumnValueFilter.new(Bytes.toBytes('cf1'),Bytes.toBytes('age'),
CompareFilter::CompareOp.valueOf('LESS'),BinaryComparator.new(Bytes.toBytes('19')))

2.2.3 表数据量统计

#统计表 t3 数据量
count 't3'

#count结合filter
import org.apache.hadoop.hbase.filter.CompareFilter
import org.apache.hadoop.hbase.filter.SingleColumnValueFilter
import org.apache.hadoop.hbase.filter.SubstringComparator
import org.apache.hadoop.hbase.filter.BinaryComparator
import org.apache.hadoop.hbase.util.Bytes

count 't3',STARTROW=>'20191109000000',STOPROW=>'20191113090000',
COLUMNS=>['cf1:age'],
FILTER=>SingleColumnValueFilter.new(Bytes.toBytes('cf1'),Bytes.toBytes('age'),
CompareFilter::CompareOp.valueOf('LESS'),BinaryComparator.new(Bytes.toBytes('19')))

2.3 修改数据

修改数据可以向表中写入数据覆盖原来的数据即可,

#将101 列的cf1:name 名字由xiaoming 改成 xiaoxiaoming
put 't3','101','cf1:name','xiaoxiaoming'

2.4 删除数据

#删除 t3 表中 101 行中的cf2:address列
delete 't3', '101', 'cf2:address'

删除 t3 表row key为rk001,列标识符为 cf1:name,timestamp 为1392383705316的数据
delete 't3','105','cf1:age',1564390128786

#删除 t3表中 rowkey为 104 的数据
deleteall 't3','104'

2.5 清空数据

清空 t3 表中的数据
truncate 't3'

文章作者: hnbian
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 hnbian !
评论
 上一篇
介绍 HBase 过滤器类别与使用方式 介绍 HBase 过滤器类别与使用方式
1. 数据以及代码准备1.1 hbase过滤器介绍以下介绍过滤器是基于HBase2.0.2版本。 HBase的Get和Scan实例可以调用setFilter()来设置过滤器,HBase的过滤器种类繁多,以满足不同的过滤需求。Filter作用
2019-08-06
下一篇 
HBase 数据迁移的几种方式 HBase 数据迁移的几种方式
1. CopyTableBase 的 CopyTable 是一个用于复制一个表到另一个表的实用工具。它可以在同一个 HBase 集群内复制表,也可以在不同的 HBase 集群间复制表。CopyTable 可以根据时间戳范围、版本数量和过滤条
2019-07-26
  目录