本篇博客,小菌为大家带来HBase的进阶使用,关于基础入门操作大家可以去阅览小菌之前的博客《HBase的JavaAPI使用–基础篇》。
文章目录
在展示代码之前先为大家介绍一下过滤器,同时它也是我们这篇博客介绍的主角。
过滤器的类型很多,但是可以分为两大类——比较过滤器,专用过滤器
过滤器的作用是在服务端判断数据是否满足条件,然后只将满足条件的数据返回给客户端;
hbase过滤器的比较运算符:
LESS <
LESS_OR_EQUAL <=
EQUAL =
NOT_EQUAL <>
GREATER_OR_EQUAL >=
GREATER >
NO_OP 排除所有
Hbase过滤器的专用过滤器(指定比较机制):
BinaryComparator 按字节索引顺序比较指定字节数组,采用Bytes.compareTo(byte[])
BinaryPrefixComparator 跟前面相同,只是比较左端的数据是否相同
NullComparator 判断给定的是否为空
BitComparator 按位比较
RegexStringComparator 提供一个正则的比较器,仅支持 EQUAL 和非EQUAL
SubstringComparator 判断提供的子串是否出现在value中。
接下来正式上我们的代码!
一、比较过滤器
1、rowKey过滤器RowFilter
通过RowFilter过滤比rowKey 0003小的所有值出来
/**
* hbase 行键过滤器 RowFilter
* [通过RowFilter过滤 比rowKey 0003小的所有值出来]
* @throws Exception
*/
@Test
public void rowKeyFilter() throws Exception{
// 连接 数据库
Configuration conf = new Configuration();
conf.set("hbase.zookeeper.quorum","node01:2181,node02:2181,node03:2181");
Connection connection = ConnectionFactory.createConnection(conf);
//读取表
Table mytest1 = connection.getTable(TableName.valueOf("mytest1"));
Scan scan = new Scan();
//创建一个过滤器,并将其添加至scan对象 <=
RowFilter rowFilter = new RowFilter(LESS, new BinaryComparator(Bytes.toBytes("0003")));
scan.setFilter(rowFilter);
// scanner 为 行数据result的集合
ResultScanner scanner = mytest1.getScanner(scan);
for (Result result : scanner) {
// 获取 rowkey
System.out.println("rowkey:"+Bytes.toString(result.getRow()));
// 指定列族以及列 打印 列 当中的数据出来
System.out.println("id:"+Bytes.toInt(result.getValue("f1".getBytes(),"id".getBytes())));
System.out.println("age:"+Bytes.toInt(result.getValue("f1".getBytes(),"age".getBytes())));
System.out.println("name:"+Bytes.toString(result.getValue("f1".getBytes(),"name".getBytes())));
}
mytest1.close();
connection.close();
}
2、列族过滤器FamilyFilter
查询比f2列族小的所有的列族内的数据
/**
* 列族过滤器 FamilyFilter
* [查询比f2列族小的所有的列族内的数据]
* @throws Exception
*/
@Test
public void familyFilter() throws Exception{
// 获取连接
Configuration conf = new Configuration();
conf.set("hbase.zookeeper.quorum","node01:2181,node02:2181,node03:2181");
Connection connection = ConnectionFactory.createConnection(conf);
// 获取表
Table mytest1 = connection.getTable(TableName.valueOf("mytest1"));
Scan scan = new Scan();
// 创建一个过滤器并添置给scan对象
FamilyFilter familyFilter = new FamilyFilter(LESS, new BinaryComparator("f2".getBytes()));
scan.setFilter(familyFilter);
ResultScanner resultScanner = mytest1.getScanner(scan);
for (Result result : resultScanner) {
// 获取rowkey
System.out.println(Bytes.toString(result.getRow()));
System.out.println(Bytes.toString(result.getValue("f1".getBytes(),"name".getBytes())));
}
mytest1.close()