# HBase 命令

进入 HBase Shell 控制台:./bin/hbase shell

如果有 kerberos 认证,需要事先使用相应的 keytab 进行一下认证(使用 kinit 命令),认证成功之后再使用 hbase shell 进入可以使用 whoami 命令可查看当前用户.

# 一、基本命令

  • 获取帮助信息:help
  • 获取命令的详细帮助信息:help 'status'
  • 查看服务器状态:status
  • 查看版本信息:version
  • 查看当前登录用户:whoami

# 二、DDL

# 创建表

【语法】create '表名称','列族名称 1','列族名称 2','列名称 N'

【示例】

# 创建一张名为 test 的表,columnFamliy1、columnFamliy2 是 table1 表的列族。
create 'test','columnFamliy1','columnFamliy2'

# 启用、禁用表

  • 启用表:enable 'test'
  • 禁用表:disable 'test'
  • 检查表是否被启用:is_enabled 'test'
  • 检查表是否被禁用:is_disabled 'test'

# 删除表

注意:删除表前需要先禁用表

disable 'test'
drop 'test'

# 修改表

# 添加列族

命令格式: alter '表名', '列族名'

alter 'test', 'teacherInfo'

# 删除列族

命令格式:alter '表名', {NAME => '列族名', METHOD => 'delete'}

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

# 更改列族存储版本的限制

默认情况下,列族只存储一个版本的数据,如果需要存储多个版本的数据,则需要修改列族的属性。修改后可通过 desc 命令查看。

alter 'test',{NAME=>'columnFamliy1',VERSIONS=>3}

# 查看表

  • 查看所有表:list
  • 查看表的详细信息:describe 'test'
  • 检查表是否存在:exists 'test'

# 三、增删改

# 插入数据

命令格式put '表名', '行键','列族:列','值'

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

put 'test', 'rowkey1', 'columnFamliy1:a', 'valueA'
put 'test', 'rowkey1', 'columnFamliy1:b', 'valueB'
put 'test', 'rowkey1', 'columnFamliy1:c', 'valueC'

put 'test', 'rowkey2', 'columnFamliy1:a', 'valueA'
put 'test', 'rowkey2', 'columnFamliy1:b', 'valueB'
put 'test', 'rowkey2', 'columnFamliy1:c', 'valueC'

put 'test', 'rowkey3', 'columnFamliy1:a', 'valueA'
put 'test', 'rowkey3', 'columnFamliy1:b', 'valueB'
put 'test', 'rowkey3', 'columnFamliy1:c', 'valueC'

put 'test', 'rowkey1', 'columnFamliy2:a', 'valueA'
put 'test', 'rowkey1', 'columnFamliy2:b', 'valueB'
put 'test', 'rowkey1', 'columnFamliy2:c', 'valueC'

# 获取指定行、列族、列

  • 获取指定行中所有列的数据信息:get 'test','rowkey2'
  • 获取指定行中指定列族下所有列的数据信息:get 'test','rowkey2','columnFamliy1'
  • 获取指定行中指定列的数据信息:get 'test','rowkey2','columnFamliy1:a'

# 删除指定行、列

  • 删除指定行:delete 'test','rowkey2'
  • 删除指定行中指定列的数据:delete 'test','rowkey2','columnFamliy1:a'

# 四、查询

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

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

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

# get 查询

  • 获取指定行中所有列的数据信息:get 'test','rowkey2'
  • 获取指定行中指定列族下所有列的数据信息:get 'test','rowkey2','columnFamliy1'
  • 获取指定行中指定列的数据信息:get 'test','rowkey2','columnFamliy1:a'

# scan 查询

# 查询整表数据

scan 'test'

# 查询指定列簇的数据

scan 'test', {COLUMN=>'columnFamliy1'}

# 条件查询

# 查询指定列的数据
scan 'test', {COLUMNS=> 'columnFamliy1:a'}

除了列 (COLUMNS) 修饰词外,HBase 还支持 Limit(限制查询结果行数),STARTROWROWKEY 起始行,会先根据这个 key 定位到 region,再向后扫描)、STOPROW(结束行)、TIMERANGE(限定时间戳范围)、VERSIONS(版本数)、和 FILTER(按条件过滤行)等。

如下代表从 rowkey2 这个 rowkey 开始,查找下两个行的最新 3 个版本的 name 列的数据:

scan 'test', {COLUMNS=> 'columnFamliy1:a',STARTROW => 'rowkey2',STOPROW => 'rowkey3',LIMIT=>2, VERSIONS=>3}

# 条件过滤

Filter 可以设定一系列条件来进行过滤。如我们要查询值等于 24 的所有数据:

scan 'test', FILTER=>"ValueFilter(=,'binary:24')"

值包含 valueA 的所有数据:

scan 'test', FILTER=>"ValueFilter(=,'substring:valueA')"

列名中的前缀为 b 的:

scan 'test', FILTER=>"ColumnPrefixFilter('b')"

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

# 列名中的前缀为 b 且列值中包含1998的数据
scan 'test', FILTER=>"ColumnPrefixFilter('b') AND ValueFilter ValueFilter(=,'substring:A')"

PrefixFilter 用于对 Rowkey 的前缀进行判断:

scan 'test', FILTER=>"PrefixFilter('wr')"

# 参考资料