Hbase的过滤器
1 、SingleColumnValueFilter
/**
* 高级查询
* 过滤器链查询
*/
public class Demo6_Filter {
/**
* 需求:
* select * from ns1_userinfo where age <= 18 and name = narudo
*/
@Test
public void listFilter() throws IOException {
/*
* 1. 创建过滤器链
* and条件使用MUST_PASS_ALL作为条件
* or条件使用MUST_PASS_ONE
*/
FilterList filterList = new FilterList(FilterList.Operator.MUST_PASS_ALL);
/*
* 2. 构造查询条件
* 对于单列值比较器使用SingleColumnValueFilter
* ColumnFamily, qualifier, 比较过滤器(大于、小于、等于、...), value
*/
SingleColumnValueFilter ageFilter = new SingleColumnValueFilter(Bytes.toBytes("base_info"), Bytes.toBytes("age"),
CompareFilter.CompareOp.LESS_OR_EQUAL, Bytes.toBytes("18"));
SingleColumnValueFilter nameFilter = new SingleColumnValueFilter(Bytes.toBytes("base_info"), Bytes.toBytes("name"),
CompareFilter.CompareOp.EQUAL, Bytes.toBytes("narudo"));
/*
* 3. 将条件加入到过滤器链中
*/
filterList.addFilter(ageFilter);
filterList.addFilter(nameFilter);
//4.创建扫描器进行扫描
Scan scan = new Scan();
//5. 将过滤条件关联到扫描器
scan.setFilter(filterList);
//6. 获取表对象
Table table = HBaseUtils.getTable();
//7. 扫描表
ResultScanner scanner = table.getScanner(scan);
//8. 打印数据
Iterator<Result> iterator = scanner.iterator();
while (iterator.hasNext()) {
Result result = iterator.next();
HBaseUtils.showResult(result);
}
}
}
说明在查询的时候
1. 这种查询如果对应的行键,如果都包含了age和name列,就会对比值,如果都不满足就将其过滤,如果满足就获取。
2. 如果包含其中也给值,name或者age,只要其中一个列满足条件就会,就会获取。
3. 如果name和age都没有,那么视为该行满足条件
解决方案
在某个单值过滤器总添加
ageFilter.setFilterIfMissing(true);
nameFilter.setFilterIfMissing(true);
2、 比较器
2.1、RegexStringComparator
/**
*
* 测试正则比较器
* 需求:select * from ns1_userinfo where name like '%i%'
*/
@Test
public void regexStringComparatorTest() throws IOException {
//1. 创建比较器,正则:以li开头的
RegexStringComparator regexStringComparator = new RegexStringComparator("[$a-z]i[$a-z]");
//2. 获取单列值过滤器
SingleColumnValueFilter nameFilter = new SingleColumnValueFilter(Bytes.toBytes("base_info"), Bytes.toBytes("name"),
CompareFilter.CompareOp.EQUAL, regexStringComparator);
//3. 设置缺失
nameFilter.setFilterIfMissing(true);
//4.创建扫描器进行扫描
Scan scan = new Scan();
//5. 设置过滤器
scan.setFilter(nameFilter);
//6. 获取表对象
Table table = HBaseUtils.getTable();
//7. 扫描表
ResultScanner scanner = table.getScanner(scan);
//8. 打印数据
Iterator<Result> iterator = scanner.iterator();
while (iterator.hasNext()) {
Result result = iterator.next();
HBaseUtils.showResult(result);
}
}
封装HbaseUtils
/**
* 显示这个过滤器扫描的对象
*/
public static void showFilterResult(Filter filter) {
//4.创建扫描器进行扫描
Scan scan = new Scan();
//5. 设置过滤器
scan.setFilter(filter);
//6. 获取表对象
Table table = HBaseUtils.getTable();
//7. 扫描表
ResultScanner scanner = null;
try {
scanner = table.getScanner(scan);
//8. 打印数据
Iterator<Result> iterator = scanner.iterator();
while (iterator.hasNext()) {
Result result = iterator.next();
HBaseUtils.showResult(result);
}
} catch (IOException e) {
logger.warn("获取table的时候异常!", e);
} finally {
try {
table.close();
} catch (IOException e) {
logger.warn("关闭table的时候异常!", e);
}
}
}
修改之前的方法
/**
*
* 测试正则比较器
* 需求:select * from ns1_userinfo where name like '%i%'
*/
@Test
public void regexStringComparatorTest() throws IOException {
//1. 创建比较器,正则:以li开头的
RegexStringComparator regexStringComparator = new RegexStringComparator("[$a-z]i[$a-z]");
//2. 获取单列值过滤器
SingleColumnValueFilter nameFilter = new SingleColumnValueFilter(Bytes.toBytes("base_info"), Bytes.toBytes("name"),
CompareFilter.CompareOp.EQUAL, regexStringComparator);
//3. 设置缺失
nameFilter.setFilterIfMissing(true);
//4. 打印
HBaseUtils.showFilterResult(nameFilter);
}
2.2、subStringComparator
/**
*
* 测试subString比较器
* 需求:select * from ns1_userinfo where name like '%i%'
*/
@Test
public void subStringComparatorTest() throws IOException {
//1. 创建比较器,正则:以li开头的
SubstringComparator substringComparator = new SubstringComparator("i");
//2. 获取单列值过滤器
SingleColumnValueFilter nameFilter = new SingleColumnValueFilter(Bytes.toBytes("base_info"), Bytes.toBytes("name"),
CompareFilter.CompareOp.EQUAL, substringComparator);
//3. 设置缺失
nameFilter.setFilterIfMissing(true);
//4. 打印
HBaseUtils.showFilterResult(nameFilter);
}
2.3、BinaryComparator
/**
*
* 测试二进制比较器
* 需求:select * from ns1_userinfo where name = 'lixi'
*/
@Test
public void binaryComparatorTest() throws IOException {
//1. 创建比较器,正则:以li开头的
BinaryComparator binaryComparator = new BinaryComparator(Bytes.toBytes("lixi"));
//2. 获取单列值过滤器
SingleColumnValueFilter nameFilter = new SingleColumnValueFilter(Bytes.toBytes("base_info"), Bytes.toBytes("name"),
CompareFilter.CompareOp.EQUAL, binaryComparator);
//3. 设置缺失
nameFilter.setFilterIfMissing(true);
//4. 打印
HBaseUtils.showFilterResult(nameFilter);
}
2.4、BinaryPrefixComparator
/**
*
* 测试二进制前缀比较器
* 需求:select * from ns1_userinfo where name like 'li%'
*/
@Test
public void binaryPrefixComparatorTest() throws IOException {
//1. 创建比较器,正则:以li开头的
BinaryPrefixComparator binaryPrefixComparator = new BinaryPrefixComparator(Bytes.toBytes("li"));
//2. 获取单列值过滤器
SingleColumnValueFilter nameFilter = new SingleColumnValueFilter(Bytes.toBytes("base_info"), Bytes.toBytes("name"),
CompareFilter.CompareOp.EQUAL, binaryPrefixComparator);
//3. 设置缺失
nameFilter.setFilterIfMissing(true);
//4. 打印
HBaseUtils.showFilterResult(nameFilter);
}
3 、KeyValue Metadata
3.1、FamilyFilter1
/**
* 查询以base开头的列簇
*/
@Test
public void testColumnFamily1() {
//1. 创建正则比较器:以base开头的字符串
RegexStringComparator regexStringComparator = new RegexStringComparator("^base");
//2. 创建FamilyFilter:结果中只包含满足条件的列簇信息
FamilyFilter familyFilter = new FamilyFilter(CompareFilter.CompareOp.EQUAL, regexStringComparator);
//3. 打印
HBaseUtils.showFilterResult(familyFilter);
}
3.2、FamilyFilter2
/**
* 查询包含xtr的列簇
*/
@Test
public void testColumnFamily2() {
//1. 创建正则比较器:以base开头的字符串
SubstringComparator substringComparator = new SubstringComparator("xtr");
//2. 创建FamilyFilter
FamilyFilter familyFilter = new FamilyFilter(CompareFilter.CompareOp.EQUAL, substringComparator);
//3. 打印
HBaseUtils.showFilterResult(familyFilter);
}
3.3、QualifierFilter
/**
* 查询包含xtr的列簇
*/
@Test
public void testQualifierFilter() {
//1. 创建正则比较器:以base开头的字符串
SubstringComparator substringComparator = new SubstringComparator("am");
//2. 创建FamilyFilter
QualifierFilter qualifierFilter = new QualifierFilter(CompareFilter.CompareOp.EQUAL, substringComparator);
//3. 打印
HBaseUtils.showFilterResult(qualifierFilter);
}
3.4、ColumnPrefixFilter
/**
* 查询包含xtr的列簇
*/
@Test
public void testColumnPrefixFilter() {
//1. 创建ColumnPrefixFilter
ColumnPrefixFilter columnPrefixFilter = new ColumnPrefixFilter(Bytes.toBytes("a"));
//2. 打印
HBaseUtils.showFilterResult(columnPrefixFilter);
}
3.5、MultipleColumnPrefixFilter
/**
* 查找以“a”或“n”开头的行和列族中的所有列
*/
@Test
public void testMultipleColumnPrefixFilter() {
//1. 创建ColumnPrefixFilter
byte[][] prefixes = new byte[][] {Bytes.toBytes("a"), Bytes.toBytes("n")};
MultipleColumnPrefixFilter multipleColumnPrefixFilter = new MultipleColumnPrefixFilter(prefixes);
//2. 打印
HBaseUtils.showFilterResult(multipleColumnPrefixFilter);
}
3.6、ColumnRangeFilter
/**
* 查找以“age”到“name”的列的信息
* minColumnInclusive:true为包含,false为不包含
*/
@Test
public void testColumnRangeFilter() {
//1. 创建ColumnPrefixFilter
ColumnRangeFilter columnRangeFilter = new ColumnRangeFilter(Bytes.toBytes("age"), false,
Bytes.toBytes("name"), true);
//2. 打印
HBaseUtils.showFilterResult(columnRangeFilter);
}
4 、RowKey
RowFilter
/**
* 查找rowkey=002的信息
*/
@Test
public void testRowFilter() {
//1. 创建RowFilter
BinaryComparator binaryComparator = new BinaryComparator(Bytes.toBytes("002"));
RowFilter rowFilter = new RowFilter(CompareFilter.CompareOp.EQUAL, binaryComparator);
//2. 打印
HBaseUtils.showFilterResult(rowFilter);
}
5 、Utility
FirstKeyOnlyFilter
/**
* 查找指定表中的所有的行键的第一个列
*/
@Test
public void testFirstKeyOnlyFilter() {
//1. 创建RowFilter
FirstKeyOnlyFilter firstKeyOnlyFilter = new FirstKeyOnlyFilter();
//2. 打印
HBaseUtils.showFilterResult(firstKeyOnlyFilter);
}
最后举例
/**
* 需求:select * from ns1_userinfo where age <= 18 or name = lixi
*/
@Test
public void listFilter2() {
//1.
FilterList filterList = new FilterList(FilterList.Operator.MUST_PASS_ONE);
SingleColumnValueFilter ageFilter = new SingleColumnValueFilter(Bytes.toBytes("base_info"), Bytes.toBytes("age"),
CompareFilter.CompareOp.LESS_OR_EQUAL, Bytes.toBytes("18"));
SingleColumnValueFilter nameFilter = new SingleColumnValueFilter(Bytes.toBytes("base_info"), Bytes.toBytes("name"),
CompareFilter.CompareOp.EQUAL, Bytes.toBytes("lixi"));
ageFilter.setFilterIfMissing(true);
nameFilter.setFilterIfMissing(true);
filterList.addFilter(ageFilter);
filterList.addFilter(nameFilter);
List<Filter> filters = filterList.getFilters();
for(Filter filter : filters) {
HBaseUtils.showFilterResult(filter);
}
}
6 、PageFilter
/**
* 需求:每行显示3条记录
* 将全部的数据分页显示出来
*
* 思路:
* 1. 第一页:
* select * from user_info where rowkey > \001 limit 3;
* 2. 其他页
* select * from user_info where rowkey > 第一页的maxrowkey limit 3;
* 3. 循环什么时候结束?
* while(true) {
* select * from user_info where rowkey > 第一页的maxrowkey limit 3;
* print 3行数据
* 结束条件:count<3
* }
*/
public class Demo7_PageFilter {
/**
* 测试分页显示user_info表中的所有数据,分页显示为3行记录
*/
@Test
public void testPageFilter() throws IOException {
//1. 创建分页过滤器,并设置每页显示3条记录
PageFilter pageFilter = new PageFilter(3);
//2. 构造扫描器
Scan scan = new Scan();
//3. 给扫描器设置过滤器
scan.setFilter(pageFilter);
//4. 获取表的管理器
Table table = HBaseUtils.getTable();
//5. 遍历显示
String maxKey = ""; // 最大key值记录器
while(true) {
int count = 0; // 计算器
//6. 获取结构扫描器
ResultScanner scanner = table.getScanner(scan);
//7. 获取迭代器迭代
Iterator<Result> iterator = scanner.iterator();
//8. 迭代
while (iterator.hasNext()) {
Result result = iterator.next();
System.out.println(new String(result.getRow()));
count++;
maxKey = Bytes.toString(result.getRow());
//9. 打印
HBaseUtils.showResult(result);
}
System.out.println("------------------------------------");
//10. 判断是否可以结束·
if (count < 3) break;
//11. 设置下一次开始查询的行键号
scan.setStartRow(Bytes.toBytes(maxKey + "\001"));
}
}
}