Hbase采用ColumnFamily存储,特别适用于稀疏数据存储。

存储结构概览

HBASE TABLE rowKey ColumnFamily1 ColumnFamily2 ColumFamily3
col1 col2 col3 col1 col2 col1 col2 col3
Row1 1 v11 v12 v13 v14 v15 v16 v17 v18
Row2 2 v21 v22 v23 v24 v25 v26 v27 v28
Row3 3 v31 v32 v33 v34 v35 v36 v37 v38

命令行连接hbase

  1. hbase shell

列举表

list

建表语句

create 't_demo','ColumnFamily1','ColumnFamily2','ColumnFamily3'

写数据

格式

put '表名','主键','列簇:列名','值'

示例

put 't_demo','1','ColumnFamily1:col1','v11'    
put 't_demo','1','ColumnFamily1:col2','v12'
put 't_demo','1','ColumnFamily1:col3','v13'     
put 't_demo','1','ColumnFamily2:col1','v14'     
put 't_demo','1','ColumnFamily2:col2','v15'     
put 't_demo','1','ColumnFamily3:col1','v16'     
put 't_demo','1','ColumnFamily3:col2','v17'     
put 't_demo','1','ColumnFamily3:col3','v18'

put 't_demo','3','ColumnFamily4:col1',3
put 't_demo','4','ColumnFamily4:col1',5
put 't_demo','5','ColumnFamily4:col1',8

查询数据

查询一行

get 't_demo','1'

结果

hbase(main):049:0> get 't_demo','1'
COLUMN CELL
ColumnFamily1:col1 timestamp=1593325545769, value=v1
ColumnFamily1:col2 timestamp=1593325958953, value=v12
ColumnFamily1:col3 timestamp=1593325958985, value=v13
ColumnFamily2:col1 timestamp=1593325959014, value=v14
ColumnFamily2:col2 timestamp=1593325959039, value=v15
ColumnFamily3:col1 timestamp=1593325959062, value=v16
ColumnFamily3:col2 timestamp=1593325959090, value=v17
ColumnFamily3:col3 timestamp=1593325959744, value=v18
8 row(s) in 0.0390 seconds

查询某个列簇

get 't_demo','1','ColumnFamily1'

结果

hbase(main):050:0> get 't_demo','1','ColumnFamily1'
COLUMN CELL
ColumnFamily1:col1 timestamp=1593325545769, value=v1
ColumnFamily1:col2 timestamp=1593325958953, value=v12
ColumnFamily1:col3 timestamp=1593325958985, value=v13
3 row(s) in 0.0160 seconds

查询某个列

get 't_demo','1','ColumnFamily1:col1'

结果

hbase(main):051:0> get 't_demo','1','ColumnFamily1:col1'
COLUMN CELL
ColumnFamily1:col1 timestamp=1593325545769, value=v1
1 row(s) in 0.0170 seconds

scan表

scan 't_demo'

scan列簇

//单列
scan 't_demo',{COLUMNS: 'ColumnFamily1'}
//多列
scan 't_demo', {COLUMNS =>  ['ColumnFamily1','ColumnFamily2']}

scan列

//单列
scan 't_demo', {COLUMNS =>  'ColumnFamily1:col1'}
//多列
scan 't_demo', {COLUMNS =>  ['ColumnFamily1:col1', 'ColumnFamily1:col2', 'ColumnFamily2:col1']}

限制条数

scan 't_demo', {COLUMNS => 'ColumnFamily1:col1', LIMIT => 10}

注意limit限制的条数是限制查询结果中的rowkey个数,不是列的数量

限制区间

scan 't_demo', {COLUMNS => 'ColumnFamily1:col1', TIMERANGE => [1622679672018-10000, 1622679672018]}

过滤

过滤类型 Filter 语法示例
列簇过滤 FamilyFilter scan 't_demo', FILTER=>"FamilyFilter(=,'substring:ColumnFamily')"
列过滤 ColumnPrefixFilter scan ‘t_demo’, FILTER=>”ColumnPrefixFilter(‘col1’)”
值过滤 ValueFilter scan ‘t_demo’, FILTER=>”ValueFilter(=,’binary:v11’)”

值过滤查询

精确查询

scan 't_demo', FILTER=>"ValueFilter(=,'binary:v11')"

包含查询

scan 't_demo', FILTER=>"ValueFilter(=,'substring:v1')"

比较查询

scan 't_demo', FILTER=>"ValueFilter(<=,'binary:10')" 
scan 't_demo', FILTER=>"ValueFilter(<,'binary:10')" 
scan 't_demo', FILTER=>"ValueFilter(>,'binary:10')" 
scan 't_demo', FILTER=>"ValueFilter(>=,'binary:10')"

值的注意的是: >= 不仅会把指定范围内的结果查询出来,像v11这样子的都会查到

由于值过滤默认是基于全部列查询,太宽泛,效率不够高,如果需要精确到列,需要使用ColumnPrefixFilter

列值过滤

scan 't_demo', FILTER=>"ColumnPrefixFilter('col1') AND ValueFilter(=,'substring:v1')" 
scan 't_demo', FILTER=>"FamilyFilter(=,'substring:ColumnFamily') AND ValueFilter(=,'substring:v1')"

运维

启动regionServer

./hbase-daemon.sh start regionserver

启动hbase

./start-hbase.sh