hbase-2
- DDL
- DML
- 过滤器
- 行过滤器
- 列过滤器
- 组合查询
- INCR
- 管理命令
- 导入HBASE表
DDL
执行命令bin/hbase shell
进入hbase命令行
表增删改查
list#显示全部表
create '表名','列族1','列族2',...# 创建表
desc[ribe] '表名'# 查看表信息
alter 'student',{NAME=>'info',VERSIONS=>3}# 将versions值改为3
disable '表名'# 表下线
enable tab_name# 表上线
drop '表名'# 删除表,删除前要先下线
命名空间
命名空间操作与表操作基本一致,只需要在每个命令前添加_namespace
,注明为命名空间操作
list_namespace#查看命名空间
create_namespace '命名空间名称'# 创建命名空间
create '命名空间:表','列族1','列族2',...# 创建表时指定命名空间,不指定命名空间默认为default命名空间
drop_namespace '命名空间'# 删除命名空间,命名空间删除前需要清空该命名空间下的表
DML
# 向指定的位置添加数据,当数据已存在时,就是覆盖修改
put 'namespace:table', 'rowkey', 'column-family:column', 'value'
# 查看表数据
scan '表名'
get '表名','行号'#查看单行数据
# 查看以前指定个版本的信息
scan 'stu',{RAW=>true,VERSIONS=>10}
shell中的中文会以十六进制编码显示,要想将这些编码显示为中文,需要在get命令后添加一个属性:{FORMATTER=>‘toString
’}
# 删除
delete 'table','rowkey','column-family:column'
deleteall 'table','rowkey'
执行delete操作时,如果表中某个列有多次修改,会删除最近的依次修改
默认保存最近三次操作的时间戳
执行shell脚本:hbase shell path
# 获取行数
count 'table'
# 执行大数据量的计数
hbase org.apache.hadoop.hbase.mapreduce.RowCounter 'table'
scan table
为全表扫描,是一个比较影响性能的操作,一般需要搭配限制条件使用
# 限定条数
scan 'table',{LIMIT=>xx}
# 指定查询列
scan 'table',{COLUMNS=>[]}
# 根据`rowkey`查询
scan '表名',{`ROWPREFIXFILTER`=>''}
过滤器
scan ‘表名’,{FILTER=>“过滤器(比较运算符,‘比较器表达式’)”}
比较器 | 效果 |
| 匹配完整字节数组 |
| 匹配字节数组前缀 |
| 匹配比特位 |
| 匹配空值 |
| 匹配正则表达式 |
| 匹配子字符串 |
比较器表达式:
比较器 | 表达式语言缩写 |
| binary:值 |
|
|
| bit:值 |
| null |
|
|
| substring:值 |
行过滤器
案例:查询行键位001的数据
# 两个引号嵌套,外面需要使用双引号
# =代表要做的是等值判断
# binary:001代表要判断的值
scan 'table',{FILTER=>"RowFilter(=,'binary:001')"}
使用过滤器的重点:
- shell中执行的ruby脚本,还是需要调用hbase提供的Java api
- 过滤器再hbase中使用表达式描述,在java中使用new对象方式
- rowfilter就是java中filter构造器名称
- =是JRuby一个特殊记号,表示是一个比较运算符
列过滤器
scan 'table',{FILTER=>"SingleColumnValueFilter('c1','category',=,'binary:phone')"}
组合查询
案例:查询类型为phone且支付方式为1的数据
scan 'table',{FILTER=>"SingleColumnValueFilter('c1','category',=,'binary:phone') AND SingleColumnValueFilter('c1','pay_way',=,'binary:1')"}
注意:HBase中的比较默认都是字符串比较,如果比较数值,会出现不准确的情况。
INCR
incr可以实现对某个单元格的值进行原子性计数,语法:incr 'table',‘rowkey’,'column-family:column',累加值
累加值默认为1
- 如果某一列要实现计数功能,必须要使用incr来创建对应的列
- 使用put创建的列是不能实现累加的
使用incr插入数据:
# 创建表之后
incr 'table','rowkey','column-family:column',value
# 计数器单独编码,一般scan无法显示
get_counter 'table','rowkey','column-family:column'
# 使用incr累加1
incr 'table','rowkey','column-family:column',1
管理命令
# 显示服务器状态
status
# 显示当前用户
whoami
# 显示所有表
list
# 统计指定表的记录数
count
# 展示表的结构信息
describe
# 检查表是否存在
exists
# 检查表是否启用或禁用
is_enabled is_disabled
# 改变表和列族的模式
alter
# 清空表数据
truncate
导入HBASE表
create external table student(
rowkey string,
first_name string,
last_name string,
addr_city string,
addr_country string)
stored by 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'
with serdeproperties(
# hbase中列簇:列名,rowkey固定写法::key,需要和上面的字段列表对应
"hbase.columns.mapping"=":key,name:first_name,name:last_name,addr:city,addr:country")
tblproperties("hbase.table.name"="stu");