HBase命令行操作

2. HBase数据库——命令行操作

为什么不直接取名叫HBase命令行操作而是还要加上数据库三个字?因为直接叫HBase总是会忽略它是数据库这个事情,导致有些时候不能很快的反应过来并且理解一些东西,故而特地加了数据库三个字

HBase数据库的命令行操作也就是通过HBase的命令行终端并通过命令的形式来操作HBase数据库,即HBase数据库的表、数据等的增删改查等操作

该文档还会在后续的学习与使用中继续补充和完善,主要内容围绕HBase数据库的命令行命令进行

2.1. 启动HBase及其命令行

想要通过HBase命令行进行HBase数据库的表、数据等的增删改查等操作需要先打开HBase的命令行

注意:下面出现的${HBASE_HOME}${HBASE_HOME}代指的是Hadoop和HBase的主目录路径

启动HBase及其命令行一般流程:

  1. HBase安装完成并且能够正常启动与使用

  2. 开启HBase集群${HBASE_HOME}/bin/start-hbase.sh

    注意:HBase非单机模式启动前你需要先启动Hadoop集群${HADOOP_HOME}/sbin/start-dfs.sh

  3. 打开HBase的命令行${HBASE_HOME}/bin/hbase shell

eg:我的${HADOOP_HOME}=/usr/local/hadoop2${HBASE_HOME}=/usr/local/hbase,并且HBase集群配置是非单机模式的。所以我的前置操作如下:

# 1.启动Hadoop集群
/usr/local/hadoop2/sbin/start-dfs.sh
# 2.启动HBase集群
/usr/local/hbase/bin/start-hbase.sh
# 3.启动HBase命令行
/usr/local/hbase/bin/hbase shell

一些可能会用到的HBase操作知识:

  1. HBase的web页面地址:http://<HBase主节点的IP或映射名>:端口号,HBAse的wbe默认端口号是16010或60010。eg:HBase主节点IP:168.254.200.101,端口号默认,则HBase的Wbe页面访问地址为:http://168.254.200.101:16010/

  2. 退出HBase命令行:在HBase命令行输入exit或按下Ctrl+D

  3. 关闭HBase集群:${HBASE_HOME}/bin/stop-hbase.sh

    我的关闭HBase集群命令就是:/usr/local/hbase/bin/stop-hbase.sh

  4. 关闭Hadoop集群:



2.2. HBase数据库的常用操作命令

注意:下面将以Student表的操作为例,并且有些命令只提供示例不提供说明(有时候一例胜千言,学习是需要一定的关联、联想、抽象能力的)

一些杂七杂八的思考:

  1. HBase是NoSQL键值数据库,通过一组值(行键、列族名、列标识、时间戳、状态标识(删除标记还是…标记))作为键来标识一个数据值。后面的HBase数据库操作命令也是基于这种关系
  2. HBase键的内容需要包含行键、列族名、列标识是因为HBase表数据的基本结构
  3. HBase键的内容需要包含时间戳、状态标记是跟HBase数据的更新方式有关,HBase的数据更新方式是冗余的方式,时间戳体现版本,标记体现操作

HBase的对象层次结构:

  1. 系统:版本、状态,拥有的表与表的状态?
  2. 命令空间?表隶属于命令空间
  3. 表:表名、拥有的列族
  4. 列族:列族名、列族属性
  5. 数据:所属列族+列标识、数据值、数据时间戳、数据状态

注意:下面的命令出现顺序就以这个简陋的、不科学的HBase的对象层次结构来组织

2.2.1. 获取帮助命令

命令格式:help ['具体命令']

使用示例:

# 获取HBase命令帮助(会输出所有HBase命令及详情?)
help

#获取status这条具体命令的详细信息
help 'status'

2.2.2. HBase系统层次操作命令

命令格式格式使用示例示例任务
查看服务器状态statusstatus查看服务器状态
查看版本信息versionversion查看版本信息
查询有哪些表listlist查询有哪些表
检查表是否存在exists ‘表名’exists ‘Student’检查Student表是否存在

表的启用/禁用命令

enable和disable可以启用或禁用表,is_enabled和is_disabled可以检查表是否被禁用或启用

eg:使用示例(以Student表为例):

# 禁用表
disable 'Student'

# 检查表是否被禁用
is_disabled 'Student'

# 启用表
enable 'Student'

# 检查表是否被启用
is_enabled 'Student'

2.2.3. HBase的表层次操作命令

3.1、创建表

命令格式:

create ‘表名称’, ‘列族名称1’,‘列族名称2’, ... ,‘列名称N’
#或:
create '表名', {NAME=>'列族名',VERSIONS=>'值',...}, {NAME=>'列族名',VERSIONS=>'值',...},...

eg:创建一张名为Student的表,包含基本信息(baseInfo)、学校信息(schoolInfo)两个列族

create 'Student','baseInfo','schoolInfo'

3.2、查看表的基本信息

命令格式:

desc ‘表名’
#或者?
describe ‘表名’

eg:查看我们创建的那一张Student表的基本信息

describe 'Student'

3.3、删除表

命令格式:

drop '表名'
#注意:删除表前需要先禁用表-->>disable '表名'

eg:删除Student表

# 禁用Student表
disable 'Student'
# 删除Student表
drop 'Student'

3.4、表的修改

列族的增加、删除、修改操作是不是有点像代码的顺序执行操作?如果是不存在的就添加,如果存在则后运行的列族信息覆盖前运行的列族信息,。。。

3.4.1、添加列族

命令格式:

alter ‘表名’, ‘列族名’

eg:为Student表添加列族teacherInfo

alter 'Student', 'teacherInfo'

3.4.2、更改列族的信息

eg:更改Student表的列族baseInfo的存储版本的限制为3(默认情况下,列族只存储一个版本的数据,如果需要存储多个版本的数据,则需要修改列族的属性。修改后可通过desc命令查看)

alter 'Student',{NAME=>'baseInfo',VERSIONS=>3}

3.4.3、删除列族

命令格式:

alter ‘表名’, {NAME => ‘列族名’, METHOD => ‘delete’}

eg:删除Student表的teacherInfo列族

alter 'Student', {NAME => 'teacherInfo', METHOD => 'delete'}

思考:列族的删除就是把他的METHOD 属性更改改为delete,也就是标记为删除状态?如果是这种的话,HBase真是把标记这种手段玩到了极致,因为HBase对数据的删除、修改也是通过标记来区分。。。window等操作系统的文件删除操作也是标记,也就是那个回收站功能。。。延迟操作?

2.2.4. HBase的数据层次操作命令

4.1、插入数据

命令格式:

put ‘表名’, ‘行键’,‘列族:列’,‘值’

注意:如果新增数据的行键值、列族名、列名与原有数据完全相同,则相当于更新操作
eg:下面为Student插入一些数据的示例

put 'Student', 'rowkey1','baseInfo:name','tom'
put 'Student', 'rowkey1','baseInfo:birthday','1990-01-09'
put 'Student', 'rowkey1','baseInfo:age','29'
put 'Student', 'rowkey1','schoolInfo:name','Havard'
put 'Student', 'rowkey1','schoolInfo:localtion','Boston'
put 'Student', 'rowkey2','baseInfo:name','jack'
put 'Student', 'rowkey2','baseInfo:birthday','1998-08-22'
put 'Student', 'rowkey2','baseInfo:age','21'
put 'Student', 'rowkey2','schoolInfo:name','yale'
put 'Student', 'rowkey2','schoolInfo:localtion','New Haven'
put 'Student', 'rowkey3','baseInfo:name','maike'
put 'Student', 'rowkey3','baseInfo:birthday','1995-01-22'
put 'Student', 'rowkey3','baseInfo:age','24'
put 'Student', 'rowkey3','schoolInfo:name','yale'
put 'Student', 'rowkey3','schoolInfo:localtion','New Haven'
put 'Student', 'wrowkey4','baseInfo:name','maike-jack'

4.2、删除数据

eg:一些删除示例

# 删除指定行(删除Student表的rowkey3这一行数据)
delete 'Student','rowkey3'

# 删除指定行中指定列的数据(删除Student表的rowkey3这一行的baseInfo:name这一列的数据)
delete 'Student','rowkey3','baseInfo:name'

4.3、修改(更新)数据

插入数据,如果新增数据的行键值、列族名、列名与原有数据完全相同,则相当于更新操作

4.4、查询数据

查询数据的命令较为复杂,对查询数据命令特别的说明,请看后面的文档

2.2.5. HBase的数据层次操作命令——查询数据

hbase中访问数据有两种基本的方式:

  • 按指定rowkey获取数据:get方法;
  • 按指定条件获取数据:scan方法。

scan查询可以设置begin和end参数来访问一个范围内所有的数据。get查询本质上就是begin和end相等的一种特殊的scan查询

5.1、Get查询

eg:Get查询的一些使用示例

# 获取指定行中所有列的数据信息
get 'Student','rowkey3'

# 获取指定行中指定列族下所有列的数据信息
get 'Student','rowkey3','baseInfo'

# 获取指定行中指定列的数据信息
get 'Student','rowkey3','baseInfo:name'

5.2、scan查询

命令格式:scan ‘表名’,{条件列表}

scan命令的条件修饰符包括:

  • COLUMN,用于指定列族或列。条件格式:COLUMN=>“列或列族列表”
  • STARTROW(指定查询的ROWKEY起始行,会先根据这个key定位到region,再向后扫描)。条件格式:STARTROW=>“起始行键”
  • STOPROW(指定查询的ROWKEY结束行)。条件格式:STOPROW=>“起始行键”
  • TIMERANGE(限定查询的数据的时间戳范围)。条件格式:TIMERANGE=>[开始时间戳,截止时间戳]
  • VERSIONS(版本数,即最多显示几个版本)。条件格式:VERSIONS=>版本数
  • FILTER(按条件过滤行)。条件格式:FILTER=>“过滤器列表”
  • Limit(限制查询结果行数)。条件格式:Limit=>限制返回结果的行数

没有设置条件,即:scan '表名',则查询整表数据。scan的条件有点像是指定显示的内容

单个条件参数的scan命令,命令的”{}“可以省略:scan '表名',条件

5.2.1、查询整表数据

# 查询Student表整表数据
scan 'Student'

5.2.2、COLUMN条件参数,条件查询/指定查询

# 查询指定列簇的数据
scan 'Student', {COLUMN=>'baseInfo'}
# 注意:因为是单个条件参数,所以花括号可以省略(下同),即命令可以写作:
scan 'Student', COLUMN=>'baseInfo'

# 查询指定列的数据
scan 'Student', {COLUMNS=> 'baseInfo:birthday'}

# 查询指定多个列或列族
sana 'Student',{COLUMNS=> "baseInfo:birthday,schoolInfo"}

# 查询从rowkey2这个rowkey开始,查找下两个行的最新3个版本的name列的数据:
scan 'Student', {COLUMNS=> 'baseInfo:name',STARTROW => 'rowkey2',STOPROW => 'wrowkey4', LIMIT=>2, VERSIONS=>3}

5.2.3、FILTER条件参数,条件过滤/过滤查询

Filter可以设定一系列条件(过滤器)来进行过滤。

eg:一些示例

# 行键等于24
scan 'Student', FILTER=>"RowFilter(=,'binary:24')"
# 行键包含24
scan 'Student', FILTER=>"RowFilter(=,'substring:24')"
# 行键的前缀等于wr
scan 'Student', FILTER=>"PrefixFilter('wr')" 

# 列族等于24
scan 'Student', FILTER=>"FamilyFilter(=,'binary:24')"
# 列族包含24
scan 'Student', FILTER=>"FamilyFilter(=,'substring:24')"

# 列标识符等于“b”的,注意是列标识符不是列族!!!
scan 'Student', FILTER => "QualifierFilter(=,'binary:b')"
# 列标识符含有“b”的,注意是列标识符不是列族!!!
scan 'Student', FILTER => "QualifierFilter(=,'substring:b')"
# 列标识符前缀为birth的,注意是列标识符不是列族!!!
scan 'Student', FILTER=>"ColumnPrefixFilter('birth')"

# 时间戳?范围还是...?这个过滤器暂时不了解
TimestampsFilter(参数1,参数2)

# 列值等于24的所有数据
scan 'Student', FILTER=>"ValueFilter(=,'binary:24')"
# 列值包含yale的所有数据
scan 'Student', FILTER=>"ValueFilter(=,'substring:yale')"

# 针对单个列的值进行过滤,这个过滤器暂时不了解
SingleColumnValueFilter

# 限制返回的行数,这个过滤器暂时不了解
PageFilter

思考:FILTER的这些过滤器,如ValueFilter(=,‘binary:24’),ValueFilter(=,‘substring:yale’),ColumnPrefixFilter(‘birth’),是不是长得像函数调用?

##FILTER中支持多个过滤条件通过括号、AND和OR进行组合

eg

# 列名中的前缀为birth且列值中包含1998的数据
scan 'Student', FILTER=>"ColumnPrefixFilter('birth') AND ValueFilter ValueFilter(=,'substring:1998')"
#上面这条命令是不是错了?应该改成下面这样才对?
scan 'Student', FILTER=>"ColumnPrefixFilter('birth') AND ValueFilter(=,'substring:1998')"

5.2.4、多条件参数的scan查询

# 完整点的多条件参数的scan查询示例
scan 'Student', {COLUMNS=> 'baseInfo:name',STARTROW => 'rowkey2',STOPROW => 'wrowkey4', LIMIT=>2, VERSIONS=>3, FILTER=>"ColumnPrefixFilter('birth') AND ValueFilter(=,'substring:1998')"}
  • 25
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值