HBase 进阶笔记
高级查询
HBase的Java API提供了一些高级的查询功能。所谓的“高级”,其实一点也不高级,无非就是对HBase的表进行一些范围化的查询和数据的过滤,而不是用get仅取出一个行键的内容。
为了测试方便,我这里插入一些简单的测试数据,待会就是对这些数据进行查询:
put 'tab1','rk1','cf1:c1','val1'
put 'tab1','rk1','cf1:c2','val2'
put 'tab1','rk2','cf1:c1','val3'
put 'tab1','rk3','cf1:c2','val4'
put 'tab1','rk4','cf1:c3','val5'
put 'tab1','rk5','cf1:c4','val6'
put 'tab1','rk6','cf1:c1','val7'
执行后tab1表变成了下面这样子:
rk | cf1:c1 | cf1:c2 | cf1:c3 | cf1:c4 |
---|---|---|---|---|
rk1 | val1 | val2 | ||
rk2 | val3 | |||
rk3 | val4 | |||
rk4 | val5 | |||
rk5 | val6 | |||
rk6 | val7 |
很明显,这是一张比较稀疏的表。
Scan 查询
首先,我们可以利用Scan进行全表扫描:
package cn.lazycat.bdd.hbase.ext;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.HBaseConfiguration;
import org.apache.hadoop.hbase.client.HTable;
import org.apache.hadoop.hbase.client.Result;
import org.apache.hadoop.hbase.client.ResultScanner;
import org.apache.hadoop.hbase.client.Scan;
import java.io.IOException;
import java.util.Map;
import java.util.NavigableMap;
public class HBaseAdvDemo1 {
public static void main(String[] args) throws IOException {
Configuration conf = HBaseConfiguration.create();
conf.set("hbase.zookeeper.quorum", "hadoop1:2181," +
"hadoop2:2181,hadoop3:2181");
HTable tab = new HTable(conf, "tab1".getBytes());
// 创建scan对象
Scan scan = new Scan();
// 得到结果集
ResultScanner rs = tab.getScanner(scan);
// 遍历
for (Result res : rs) {
// 取得行键
String rk = new String(res.getRow());
// 取得每一列的数据
// 注意三层泛型:
// 1. byte[]表示列族的名称,Map表示列中储存的列信息
// 2. byte[]表示列的名称,Map表示不同版本的列数据
// 3. Long表示一个版本的时间戳,byte[]表示储存的具体数据
NavigableMap<byte[], NavigableMap<byte[],
NavigableMap<Long, byte[]>>> map = res.getMap();
// 遍历Map
for (Map.Entry<byte[], NavigableMap<byte[],
NavigableMap<Long, byte[]>>> entry : map.entrySet()) {