Hbase 常用shell操作

打印 上一主题 下一主题

主题 913|帖子 913|积分 2739

目录
1、创建表
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';
  注意:


  • create要写成小写
  • 一个表可以包罗多少个列蔟
  • 命令剖析:调用hbase提供的ruby脚本的create方法,转达两个字符串参数
  • 通过下面文档可以看到每个命令都是一个ruby脚本

    • https://github.com/apache/hbase/tree/branch-2.1/hbase-shell/src/main/ruby/shell/commands

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文档。

    • Apache HBase 2.2.3 API

9.1、HBase中的过滤器



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



  • 过滤器进行分类
rowkey
过滤器
RowFilter
实现行键字符串的比力和过滤
PrefixFilter
rowkey前缀过滤器
KeyOnlyFilter
只对单元格的键进行过滤和显示,不显示值
FirstKeyOnlyFilter
只扫描显示雷同键的第一个单元格,其键值对会显示出来
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大的


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

怀念夏天

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表