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
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