HBase过滤器基本概念
过滤器可以根据列族、列、版本等更多的条件来对数据进行过滤,基于HBase本身提供的三维有序(主键、列、版本有序),这些过滤器可以高效地完成查询过滤的。
使用过滤器至少需要两类参数:
操作符
HBase提供了枚举类型的变量来表示这些抽象的操作符
- LESS (<)
- LESS_OR_EQUAL (<=)
- EQUAL (=)
- NOT_EQUAL (!=)
- GREATER_OR_EQUAL (>=)
- GREATER (>)
- NO_OP (no operation)
2.x 前 org.apache.hadoop.hbase.filter.CompareFilter.CompareOp,3.0后移除该枚举。
2.x后 org.apache.hadoop.hbase.CompareOperator
比较器
代表具体的比较逻辑,如字节级的比较、字符串级的比较等,它作为过滤器的核心组成之一。
如
- RegexStringComparator 正则比较器
- SubstringComparator 子字符串比较
- BinaryPrefixComparator 前缀二进制比较器
- BinaryComparator 二进制比较器
过滤器使用例子
列如我要查找
tableName表family列族qualifier列,
值为以’liuyu’开头字符串的行,
即列值匹配(CompareOperator.EQUAL等于)以’liuyu’开头字符串的行。
使用 RegexStringComparator比较器,作为SingleColumnValueFilter 列值 过滤器 的 组成。
操作示例如下
//获取HBase配置信息
Configuration configuration = HBaseConfiguration.create();
Connection conn = null;
try {
conn = ConnectionFactory.createConnection(configuration);
} catch (IOException e) {
e.printStackTrace();
return;
}
//初始化HBase 表
Table table=conn.getTable(TableName.valueOf("tableName"));
Scan scan = new Scan();
//列值过滤器
//列族
String family="family";
//列
String qualifier="qualifier";
//比较器,正则比较器,以'liuyu'开头的字符串
RegexStringComparator comparator=new RegexStringComparator("liuyu.");
//设定值与以'liuyu'开头字符串 相等 CompareOperator.EQUAL
SingleColumnValueFilter singleColumnValueFilter = new SingleColumnValueFilter(family.getBytes(),
qualifier.getBytes(), CompareOperator.EQUAL, comparator);
scan.setFilter(singleColumnValueFilter);
ResultScanner resultScanner=table.getScanner(scan);
for(Result result: resultScanner){
String rowkey = Bytes.toString(result.getRow());
System.out.println("row key :" + rowkey);
Cell[] cells = result.rawCells();
for (Cell cell : cells) {
System.out.println(Bytes.toString(cell.getFamilyArray(),cell.getFamilyOffset(),cell.getFamilyLength())+":"+Bytes.toString(cell.getQualifierArray(), cell.getQualifierOffset(), cell.getQualifierLength()) + "::" +
Bytes.toString(cell.getValueArray(), cell.getValueOffset(), cell.getValueLength()));
}
System.out.println("-----------------------------------------");
}