0


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')"}

本文转载自: https://blog.csdn.net/2301_77843163/article/details/137204220
版权归原作者 不爱学习的QQtu 所有, 如有侵权,请联系我们删除。

“HBase命令行操作”的评论:

还没有评论