HBaseShell

发布于 2022-01-25  84 次阅读


概念

  • 命名空间:
    • 类似于MySQL中的数据库(Schema)的概念
    • HBase中有一个默认的命名空间,default
  • 表:
    • HBase中用于存储数据的容器
    • 如果在创建表的时候没有指定命名空间,则会被放到默认的命名空间中
  • 行键(RowKey):类似于MySQL中的主键;必需的
  • 列族(Column Family):若干列的集合;在创建表的时候,至少需要提供一个列族
  • 列(Column):任意;在添加数据的时候需要指定列族下的列
  • 值(Value):列和行键对应的单元格中的数据
  • 版本(Version):
    • HBase中一个值可以有多个版本,在创建表提供列族信息时,可以指定该列族下的列中可以存放多少个版本的数据 默认是1
    • 版本信息由时间戳表示

命令行操作

创建命名空间

create namespace '命名空间名'

删除命名空间

drop namespace '命名空间'

说明: 只能删除没有表(空的)的命名空间,如果指定的命名空间中存在表,则需要先删除表再删除命名空间

查看命名空间描述:

describe namespace '命名空间名'

修改命名空间属性:

  • 添加属性:alter namespace '命名空间名',{METHOD=>'set','属性名'=>'属性值'}
  • 移除属性:alter namespace '命名空间名',{METHOD=>'unset',NAME=>'属性名'}

创建表

  • create '[命名空间名:]表名',{NAME=>'列族名1'[,'属性名1'=>'属性值1',...]}[,{NAME=>'列族2'[,'属性名1'=>'属性值1',...]}]
  • create '[命名空间名:]表名','列族名1'[,'列族名2',...]

删除表

drop '表名'

drop all '匹配表名的正则'

注意:

  • 在删除表之前需将表禁用
    • disable '表名'
    • disable all '匹配表名的正则'
  • 启用被禁用的表
    • enable '表名'
    • enable all '匹配表名的正则'
  • 判断表是否被禁用/启用
    • is_disabled '表名'
    • is_enabled '表名'

查看表

list

list namespace tables '命名空间'

修改表

alter '表名',NAME=>'列族名','属性名'=>'属性值'

alter '表名','列族名','属性名'=>'属性值'

注意:

  • 如果指定的列族名存在,则指的是修改该列族的信息
  • 如果指定的列族名不存在,指的是添加一个新的列族
  • 删除列族:alter '表名',NAME=>'列族名',METHOD=>'delete'

添加数据

put '[命名空间:]表名','行键','列族名:列名','值',时间戳

查看数据

  • get '表名','行键' 查看指定的行键的一行数据
  • scan '表名' 扫描整张表中的数据

删除数据

  • delete '表名','行键','列族名:列名'[,时间戳]

    • 如果不指定时间戳,则删除对应列中的时间戳最新的数据
    • 如果指定了时间戳,则删除指定的时间戳的数据
  • deleteall '表名','行键'[,'列名',时间戳]

    • 如果没有指定列名,则删除行键对应的一整行数据
    • 如果指定了列名,没有指定时间戳,则删除该行建对应的该列中的所有版本(时间戳)数据
    • 如果指定了列名,指定了时间戳,则删除比指定的时间戳(包含)旧的数据
  • truncate '表名'

    • 删除整张表中的数据,删除逻辑是利用drop命令先将表删除,然后再根据指定的表的结构新创建一张表

统计行数

count '表名' 表行数不多时

$HBASE_HOME/bin/hbase org.apache.hadoop.hbase.mapreduce.RowCounter 'tablename'

示例

#创建一张表,指定版本号为3
create 'test:teacher',{NAME=>'baseinfo',VERSIONS=>3},{NAME=>'extrainfo',VERSIONS=>5}
#创建表,预定义分区,在rowkey为0<= <10  10<= 20 20<= 30
create 'test:teacher2', {NAME=>'baseinfo',VERSIONS=>3}, SPLITS => ['10', '20', '30', '40']

#获得某一个特定值
get 'test:teacher','10001','baseinfo:name'
#扫描表中某一列
scan 'test:student',{COLUMNS=>'baseinfo:name'}
#使用limit进行行数限制
scan 'test:student',{COLUMNS=>'baseinfo:name',LIMIT=>2}
#指定从某一行开始扫描
scan 'test:teacher',{COLUMNS=>'baseinfo:name',LIMIT=>2,STARTROW=>'20001'}

过滤器

#使用过滤器 行健前缀过滤器,只有这一个有属性
scan 'test:teacher', {ROWPREFIXFILTER => '10'}
#使用空值行健过滤器,只返回行健
scan 'test:teacher',{FILTER=>'KeyOnlyFilter()'}
#使用行健过滤器,binary: 帮助数据类型转化
scan 'test:teacher',{FILTER =>"RowFilter (!=,'binary:10001')"}
#使用列名过滤器
scan 'test:student',{FILTER =>"QualifierFilter (>=,'binary:baseinfo:name')"}
#使用子串过滤器
scan 'test:student',{FILTER =>"ValueFilter (=,'binary:zhao')"}
#列名前缀过滤器
scan 'test:student',{FILTER =>"ColumnPrefixFilter ('name')"}
#使用多种过滤器进行条件结合
scan 'test:teacher',{FILTER =>"(ValueFilter (=,'binary:hello')) OR (RowFilter (>,'binary:10'))"}
#使用page过滤器,限制每页展示数量
scan 'test:teacher',{FILTER =>org.apache.hadoop.hbase.filter.PageFilter.new(2)}