Hbase 常用shell操作

目录

1、创建表

[1.1、启动HBase Shell](#1.1、启动HBase Shell)

1.2、创建表

1.3、查看表

1.4、删除表

2、插入数据

2.1、put命令

3、查看数据

3.1、get命令

3.2、查询数据中文显示

4、更新数据

4.1、使用put来更新数据

5、删除数据

5.1、delete命令

5.2、删除指定列的数据

5.3、deleteall命令删除整行数据

6、清空表

6.1、tuncate命令

7、批量导入数据集

8、扫描操作

8.1、scan命令

8.2、示例1:查询学生表中的所有数据

8.3、示例2:查询学生数据只显示1条

8.4、示例3:查询学生姓名和年龄

8.5、示例4:查询指定学生id的姓名和年龄

9、过滤器

9.1、HBase中的过滤器

9.2、过滤器的使用

9.3、示例1:使用RowFilter查询指定学生id的信息

9.4、示例2:查询在校状态为1,且年龄大于21的学生信息

通过shell的方式来维护和管理HBase。例如:执行建表语句、执行增删改查操作等等。

需求: 有以下学生数据,要将这样的一些数据保存到HBase中。

  • 下面将使用HBase shell来进行以下操作:
    • 1.创建表
    • 2.添加数据
    • 3.更新数据
    • 4.删除数据
    • 5.查询数据

1、创建表

  • 在HBase中,所有的数据也都是保存在表中的。要将学生数据保存到HBase中,首先需要将表创建出来。

1.1、启动HBase Shell

  • HBase的shell其实JRuby的IRB(交互式的Ruby),但在其中添加了一些HBase的命令。
  • 启动HBase shell:

hbase shell

1.2、创建表

  • 语法:

create '表名','列蔟名'...

  • 示例:

-- 创建学生表,表名为student_info,该表有一个列蔟为C1

create 'student_info','C1';

注意:

1.3、查看表

list

1.4、删除表

  • 要删除某个表,必须要先禁用表

1、禁用表

disable "表名"

2、删除表

drop "表名"

示例:删除student_info表

disable "student_info "

drop "student_info"

2、插入数据

往学生表中添加以下数据。

|------|----|----|----|------------|------|
| 学号 | 姓名 | 性别 | 年龄 | 入学时间 | 在校情况 |
| 0001 | 张三 | 男 | 25 | 2023-02-06 | 1 |

2.1、put命令

  • HBase中的put命令,可以用来将数据保存到表中。但put一次只能保存一个列的值。以下是put的语法结构:

put '表名','ROWKEY','列蔟名:列名','值'

添加以上数据,需要执行以下操作:

put 'student_info','0001','C1:stuno','0001'

put 'student_info','0001','C1:name','张三'

put 'student_info','0001','C1:sex','男'

put 'student_info','0001','C1:age',25

put 'student_info','0001','C1:enrollment_time','2023-02-06'

put 'student_info','0001','C1:state',1

3、查看数据

3.1、get命令

  • 在HBase中,可以使用get命令来获取单独的一行数据。语法:

get '表名','rowkey'

示例:查询指定学生号的数据

get 'student_info','0001'

3.2、查询数据中文显示

  • 在HBase shell中,如果在数据中出现了一些中文,默认HBase shell中显示出来的是十六进制编码。要想将这些编码显示为中文,需要在get命令后添加一个属性:{FORMATTER => 'toString'}

get 'student_info','0001', {FORMATTER => 'toString'}

注意:

  • { key => value},这个是Ruby语法,表示定义一个HASH结构
  • FORMATTER要使用大写
  • 在Ruby中用{}表示一个字典,类似于hashtable,FORMATTER表示key、'toString'表示值

4、更新数据

4.1、使用put来更新数据

  • 数据存在属于更新操作,数据不存在数据插入操作。

示例:更新张三的年龄为20

put 'student_info', '0001', 'C1:age', 20

注意:

  • HBase中会自动维护数据的版本
  • 每当执行一次put后,都会重新生成新的时间戳

5、删除数据

  • 删除数据的时候,其实HBase不是真的直接把数据删除掉,而是给某个列设置一个标志,然后查询数据的时候,有这个标志的数据,就不显示出来
  • 什么时候真正的删除数据呢?
    • 后台进程,专门来执行删除数据的操作

5.1、delete命令

  • 执行delete的时候
  • 如果表中的某个列簇有对一个列存在几次修改,它会删除最近的一次修改
  • 默认是保存1个保存的时间戳
  • 有一个version属性
  • 在HBase中,可以使用delete命令来将一个单元格的数据删除。语法格式如下:

delete '表名', 'rowkey', '列蔟:列'

  • 注意:此处HBase默认会保存多个时间戳的版本数据,所以这里的delete删除的是最新版本的列数据。

5.2、删除指定列的数据

delete 'student_info','0001','C1:age'

5.3、deleteall命令删除整行数据

  • deleteall命令可以将指定rowkey对应的所有列全部删除。语法:

deleteall '表名','rowkey'

示例:删除rowkey为0001的数据

deleteall 'student_info','0001'

6、清空表

6.1、tuncate命令

  • 原理:
    • 1、先将表禁用
    • 2、然后再删除表
    • 3、最后再创建表
  • truncate命令用来清空某个表中的所有数据。语法:

truncate "表名"

示例:清空student_info的所有数据

truncate 'student_info'

7、批量导入数据集

  • 在数据集/ student_info.txt 中,有一份这样的HBase数据集,我们需要将这些指令放到HBase中执行,将数据导入到HBase中。
  • 可以看到这些都是一堆的put语句。那么如何才能将这些语句全部执行呢?
  • 1、上传命令文件将该数据集文件上传到指定的目录中

cd /hbase/data

rz

  • 2、执行命令

hbase shell /hbase/data/student_info.txt

8、扫描操作

8.1、scan命令

  • 在HBase,我们可以使用scan命令来扫描HBase中的表。语法:

scan '表名'

8.2、示例1:查询学生表中的所有数据

注意:scan扫描非常耗时,要避免scan一张大表,生产环境中禁用。

scan 'student_info',{FORMATTER => 'toString'}

8.3、示例2:查询学生数据只显示1条

scan 'student_info', {LIMIT => 1, FORMATTER => 'toString'}

8.4、示例3:查询学生姓名和年龄

scan 'student_info', {COLUMNS => ['C1:name', 'C1:age'], FORMATTER => 'toString'}

  • 注意:
    • ['C1:name', ...]在Ruby中[]表示一个数组

8.5、示例4:查询指定学生id的姓名和年龄

  • 要查询指定ROWKEY的数据,需要使用ROWPREFIXFILTER,用法为:

scan '表名', {ROWPREFIXFILTER => 'rowkey'}

示例实现命令如下:

scan 'student_info', {ROWPREFIXFILTER => '0001', COLUMNS => ['C1:name', 'C1:age'], FORMATTER => 'toString'}

9、过滤器

  • 在HBase中,如果要对海量的数据来进行查询,当基本的操作无法实现时。此时,需要借助HBase中的高级语法------Filter来进行查询。Filter可以根据列簇、列、版本等条件来对数据进行过滤查询。
  • 因为在HBase中,主键、列、版本都是有序存储的,所以借助Filter,可以高效地完成查询。当执行Filter时,HBase会将Filter分发给各个HBase服务器节点来进行查询。
  • HBase中的过滤器也是基于Java开发的,只不过在Shell中,是使用基于JRuby的语法来实现的交互式查询。以下是HBase 2.2的JAVA API文档。

9.1、HBase中的过滤器

  • 在HBase的shell中,通过show_filters指令,可以查看到HBase中内置的一些过滤器。

show_filters

  • 过滤器进行分类

|------------|--------------------------------|---------------------------------------------|
| rowkey 过滤器 | RowFilter | 实现行键字符串的比较和过滤 |
| rowkey 过滤器 | PrefixFilter | rowkey前缀过滤器 |
| rowkey 过滤器 | KeyOnlyFilter | 只对单元格的键进行过滤和显示,不显示值 |
| rowkey 过滤器 | FirstKeyOnlyFilter | 只扫描显示相同键的第一个单元格,其键值对会显示出来 |
| rowkey 过滤器 | InclusiveStopFilter | 替代 ENDROW 返回终止条件行 |
| 列过滤器 | FamilyFilter | 列簇过滤器 |
| 列过滤器 | QualifierFilter | 列标识过滤器,只显示对应列名的数据 |
| 列过滤器 | ColumnPrefixFilter | 对列名称的前缀进行过滤 |
| 列过滤器 | MultipleColumnPrefixFilter | 可以指定多个前缀对列名称过滤 |
| 列过滤器 | ColumnRangeFilter | 过滤列名称的范围 |
| 值过滤器 | ValueFilter | 值过滤器,找到符合值条件的键值对 |
| 值过滤器 | SingleColumnValueFilter | 在指定的列蔟和列中进行比较的值过滤器 |
| 值过滤器 | SingleColumnValueExcludeFilter | 排除匹配成功的值 |
| 其他过滤器 | ColumnPaginationFilter | 对一行的所有列分页,只返回 [offset,offset+limit] 范围内的列 |
| 其他过滤器 | PageFilter | 对显示结果按行进行分页显示 |
| 其他过滤器 | TimestampsFilter | 时间戳过滤,支持等值,可以设置多个时间戳 |
| 其他过滤器 | ColumnCountGetFilter | 限制每个逻辑行返回键值对的个数,在 get 方法中使用 |
| 其他过滤器 | DependentColumnFilter | 允许用户指定一个参考列或引用列来过滤其他列的过滤器 |

Java API官方地址:Apache HBase 4.0.0-alpha-1-SNAPSHOT API

9.2、过滤器的使用

  • 过滤器一般结合scan命令来使用。打开HBase的JAVA API文档。找到RowFilter的构造器说明,可以看到使用格式如下:

scan '表名', { Filter => "过滤器(比较运算符, '比较器表达式')" }

  • 比较运算符

|-------|------|
| 比较运算符 | 描述 |
| = | 等于 |
| > | 大于 |
| >= | 大于等于 |
| < | 小于 |
| <= | 小于等于 |
| != | 不等于 |

  • 比较器

|------------------------|----------|
| 比较器 | 描述 |
| BinaryComparator | 匹配完整字节数组 |
| BinaryPrefixComparator | 匹配字节数组前缀 |
| BitComparator | 匹配比特位 |
| NullComparator | 匹配空值 |
| RegexStringComparator | 匹配正则表达式 |
| SubstringComparator | 匹配子字符串 |

  • 比较器表达式
    • 基本语法:比较器类型:比较器的值

|------------------------|-------------------|
| 比较器 | 表达式语言缩写 |
| BinaryComparator | binary:值 |
| BinaryPrefixComparator | binaryprefix:值 |
| BitComparator | bit:值 |
| NullComparator | null |
| RegexStringComparator | regexstring:正则表达式 |
| SubstringComparator | substring:值 |

9.3、示例1:使用RowFilter查询指定学生id的信息

分析:

  • 1.因为要学生id就是student_info表的rowkey,所以,应该使用rowkey过滤器来过滤
  • 2.通过HBase的JAVA API,找到RowFilter构造器
  • 通过上图,可以分析得到,RowFilter过滤器接受两个参数,
    • op------比较运算符
    • rowComparator------比较器
  • 所以构建该Filter的时候,只需要传入两个参数即可

实现命令如下:

scan 'student_info', {FILTER => "RowFilter(=,'binary:0001')"}

9.4、示例2:查询在校状态为1,且年龄大于21的学生信息

  • 1**、查询在校状态为1**

SingleColumnValueFilter('C1', 'state', = , 'binary:1')

  • 2、查询年龄大于21的学生信息

SingleColumnValueFilter('C1', 'age', > , 'binary:21')

  • 特别注意:使用SingleColumnValueFilter过滤器要过滤的列必须存在,如果不存在,那么这些列不存在的数据也会返回。如果不想让这些数据返回,做如下设置即可

SingleColumnValueFilter('C1', 'age', > , 'binary:21',true, true)

  • 3、组合查询

scan 'student_info', {FILTER => "SingleColumnValueFilter('C1', 'state', = , 'binary:1') AND SingleColumnValueFilter('C1', 'age', > , 'binary:21')", FORMATTER => 'toString'}

  • 注意:
    • HBase shell中比较默认都是字符串比较,所以如果是比较数值类型的,会出现不准确的情况
    • 例如:在字符串比较中3是比21大的
相关推荐
FIN技术铺2 小时前
Redis集群模式之Redis Sentinel vs. Redis Cluster
数据库·redis·sentinel
矛取矛求2 小时前
Linux如何更优质调节系统性能
linux
内核程序员kevin3 小时前
在Linux环境下使用Docker打包和发布.NET程序并配合MySQL部署
linux·mysql·docker·.net
CodingBrother4 小时前
MySQL 中的 `IN`、`EXISTS` 区别与性能分析
数据库·mysql
kayotin4 小时前
Wordpress博客配置2024
linux·mysql·docker
代码小鑫4 小时前
A027-基于Spring Boot的农事管理系统
java·开发语言·数据库·spring boot·后端·毕业设计
Ztiddler4 小时前
【Linux Shell命令-不定期更新】
linux·运维·服务器·ssh
小小不董5 小时前
Oracle OCP认证考试考点详解082系列16
linux·运维·服务器·数据库·oracle·dba
甄臻9245 小时前
Windows下mysql数据库备份策略
数据库·mysql
内蒙深海大鲨鱼5 小时前
qt之ui开发
数据库·qt·ui