HBASE(三)—— HBase 的过滤器,
HBase 的过滤器主要用来实现复杂查询的,类似 where 条件,常用的有以下几种:
- 列值过滤器:SingleColumnValueFilter
- 列名前缀过滤器:ColumnPrefixFilter
- 多个列名前缀过滤器:MultipleColumnPrefixFilter
- 行键过滤器:RowFilter
- 过滤器的组合使用
一、列值过滤器
/**
* 单一列值过滤器
*
* 查询薪水等于3000的员工
*
* @throws Exception
*/
public static void testSingleColumnValueFilter() throws Exception {
Configuration conf = new Configuration();
conf.set("hbase.zookeeper.quorum", "192.168.220.111");
// 创建表的客户端
HTable emp = new HTable(conf, "emp");
// 创建过滤器(筛选出empinfo列族的sal列值等于3000的记录)
SingleColumnValueFilter filter = new SingleColumnValueFilter(Bytes.toBytes("empinfo"), // 列族
Bytes.toBytes("sal"), // 列名
CompareFilter.CompareOp.EQUAL, // 等值关系
Bytes.toBytes("3000")); // 值
// 创建一个Scanner
Scan scanner = new Scan();
scanner.setFilter(filter);
// 执行查询
ResultScanner rs = emp.getScanner(scanner);
for (Result r : rs) {
byte[] value = r.getValue(Bytes.toBytes("empinfo"), Bytes.toBytes("ename"));
String ename = Bytes.toString(value);
System.out.println(ename);
}
emp.close();
}
二、列名前缀过滤器
/**
* 列名前缀过滤器
*
* 查询出所有员工的姓名
*
* @throws Exception
*/
public static void testColumnPrefixFilter() throws Exception {
Configuration conf = new Configuration();
conf.set("hbase.zookeeper.quorum", "192.168.220.111");
HTable emp = new HTable(conf, "emp");
// 定义列名前缀过滤器
ColumnPrefixFilter filter = new ColumnPrefixFilter(Bytes.toBytes("ename"));
Scan scanner = new Scan();
scanner.setFilter(filter);
// 执行查询
ResultScanner rs = emp.getScanner(scanner);
for (Result r : rs) {
byte[] value = r.getValue(Bytes.toBytes("empinfo"), Bytes.toBytes("ename"));
String ename = Bytes.toString(value);
System.out.println(ename);
}
emp.close();
}
三、多个列名前缀过滤器
/**
* 多个列名前缀过滤器
*
* 查询所有员工的姓名和薪水
*
* @throws Exception
*/
public static void testMultipleColumnPrefixFilter() throws Exception {
Configuration conf = new Configuration();
conf.set("hbase.zookeeper.quorum", "192.168.220.111");
HTable emp = new HTable(conf, "emp");
// 存储多个列名的二维数组
byte[][] prefixs = new byte[][]{Bytes.toBytes("ename"), Bytes.toBytes("sal")};
MultipleColumnPrefixFilter filter = new MultipleColumnPrefixFilter(prefixs);
Scan scanner = new Scan();
scanner.setFilter(filter);
// 执行查询
ResultScanner rs = emp.getScanner(scanner);
for (Result r : rs) {
byte[] value1 = r.getValue(Bytes.toBytes("empinfo"), Bytes.toBytes("ename"));
byte[] value2 = r.getValue(Bytes.toBytes("empinfo"), Bytes.toBytes("sal"));
String ename = Bytes.toString(value1);
String sal = Bytes.toString(value2);
System.out.println("ename = " + ename + ", sal = " + sal);
}
emp.close();
}
四、行键过滤器
/**
* 行键过滤器
*
* 查询行键为7839的员工的姓名和薪水
*
* @throws Exception
*/
public static void testRowFilter() throws Exception {
Configuration conf = new Configuration();
conf.set("hbase.zookeeper.quorum", "192.168.220.111");
HTable emp = new HTable(conf, "emp");
// 构造一个行键过滤器(第二个参数可以是一个正则表达式)
RowFilter filter = new RowFilter(CompareFilter.CompareOp.EQUAL, new RegexStringComparator("7839"));
// 创建一个扫描器
Scan scanner = new Scan();
scanner.setFilter(filter);
// 执行查询
ResultScanner rs = emp.getScanner(scanner);
for (Result r : rs) {
byte[] value1 = r.getValue(Bytes.toBytes("empinfo"), Bytes.toBytes("ename"));
byte[] value2 = r.getValue(Bytes.toBytes("empinfo"), Bytes.toBytes("sal"));
String ename = Bytes.toString(value1);
String sal = Bytes.toString(value2);
System.out.println("行键为7839的员工的ename = " + ename + ", sal = " + sal);
}
emp.close();
}
五、组合使用过滤器
/**
* 多个过滤器互相组合
*
* 查询员工号为7839的员工的姓名
*
* @throws Exception
*/
public static void testFilterChain() throws Exception {
Configuration conf = new Configuration();
conf.set("hbase.zookeeper.quorum", "192.168.220.111");
HTable emp = new HTable(conf, "emp");
// 1.用于过滤员工号的行键过滤器
RowFilter filter1 = new RowFilter(CompareFilter.CompareOp.EQUAL, new RegexStringComparator("7839"));
// 2.用于过滤列名的列名过滤器
ColumnPrefixFilter filter2 = new ColumnPrefixFilter(Bytes.toBytes("ename"));
// 创建一个Filter的list
FilterList filterList = new FilterList(FilterList.Operator.MUST_PASS_ALL);
filterList.addFilter(filter1);
filterList.addFilter(filter2);
// 创建一个扫描器
Scan scanner = new Scan();
scanner.setFilter(filterList);
// 执行查询
ResultScanner rs = emp.getScanner(scanner);
for (Result r : rs) {
byte[] value1 = r.getValue(Bytes.toBytes("empinfo"), Bytes.toBytes("ename"));
byte[] value2 = r.getValue(Bytes.toBytes("empinfo"), Bytes.toBytes("sal"));
String ename = Bytes.toString(value1);
String sal = Bytes.toString(value2);
System.out.println("7839\t" + ename + "\t" + sal);
}
emp.close();
}
本站文章为和通数据库网友分享或者投稿,欢迎任何形式的转载,但请务必注明出处.
同时文章内容如有侵犯了您的权益,请联系QQ:970679559,我们会在尽快处理。