编程使用过滤器
HBase提供了大量的过滤器,可用于get或scan操作,只提取所需的数据。
在HBase中,get()和scan()方法支持直接访问数据并使用start key和end key。我们可以通过向HBase查询添加限制性的选择器来限制获取的数据的数量。这些选择器包括column families(列族)、column qualifiers(列限定符)、timestamps(时间戳)、ranges(范围)和version numbers(版本号)。
HBase的过滤器如下图所示:
 
过滤器类型
下表是过滤器在比较时所依赖的运算符:
| 运算符类型 | 说明 | 
|---|---|
| BitComparator.BitwiseOp | 执行按位比较。下面是它的枚举常量: 
 | 
| CompareFilter.CompareOp | 这是一个用来进行比较的通用类型的过滤器。它可以使用操作符如相等、大于、不等于等。这还是一个byte[]比较器。下面是它的枚举常量: 
 | 
| Filter.ReturnCode | 这些是用于过滤器值的返回码。下面是它的枚举常量: 
 | 
| FilterList.Operator | 这些是用于一个filter list中多个过滤器的条件。下面是其枚举常量: 
 | 
下表是HBase中提供的过滤器:
| 过滤器类型 | 说明 | 
|---|---|
| BinaryComparator | 用于二进制字典顺序比较。它使用Bytes.compareTo(byte[], byte[])比较给定的字节数组 | 
| BinaryPrefixComparator | 这是一个binary comparator filter,比较字节数组。但是只与这个字节数组的长度相比较 | 
| BitComparator | 一个位比较器,它使用指定的字节数组对每个字节执行指定的位操 | 
| ByteArrayComparable | 这是用于字节数组比较器的基类 | 
| ColumnCountGetFilter | 这个过滤器只提供行中第一个N个列 | 
| ColumnPaginationFilter | 这基于ColumnCountGetFilter; 它有两个参数,limit和offset, 用于分页 | 
| ColumnPrefixFilter | 该过滤器用于获取与指定前缀相匹配的列的键 | 
| ColumnRangeFilter | 这个过滤器用于在min-column和maxcolumn值之间选择列 | 
| CompareFilter | 这是一个用于比较的通用过滤器 | 
| DependentColumnFilter | 该过滤器用于添加与具有相应时间戳单元格相匹配的跨列时间戳 | 
| FamilyFilter | 基于列族的过滤器 | 
| Filter | 用于row和column的过滤器,可直接在RegionServer内应用 | 
| FilterList | 使用这个,可以实现一个逻辑分区。这是一个有序的列表或一组过滤器。 可使用如下的比较运算符: 
 | 
| FirstKeyOnlyFilter | 这个过滤器只返回每行的第一个KeyValue | 
| FirstKeyValueMatchingQualifiersFilter | 这个过滤上器检查KeyValue中指定的列 | 
| FuzzyRowFilter | 这个过滤器基于模糊 row keys | 
| InclusiveStopFilter | 这个过滤器在给定的行之后停止 | 
| KeyOnlyFilter | 这个过滤器将只返回每个KeyValue中的key组成部分 | 
| MultipleColumnPrefixFilter | 这个过滤器用于选择与给定前缀匹配的列的key | 
| NullComparator | 这是一个binary comparator; 按字典顺序与给定的字节数组进行比较,使用Bytes.compareTo (byte[], byte[]) | 
| PageFilter | 这个过滤器限定结果到一个指定的分页大小 | 
| ParseConstants | 持有一系列与(被ParseFilter使用的)解析过滤器字符串相关的常量 | 
| ParseFilter | 这个过滤器允许用户通过一个字符串指定一个过滤器 | 
| PrefixFilter | 这将返回具有相同行前缀的结果 | 
| QualifierFilter | 这是基于列限定符的过滤器 | 
| RandomRowFilter | 基于随机选择的行的过滤器 | 
| RegexStringComparator | 这是一个基于正则表达式的过滤器 | 
| RowFilter | 这被用来基于row key进行过滤的过滤器 | 
| SingleColumnValueExcludeFilter | 检查一个单列的值,但并不返回被测试的列 | 
| SingleColumnValueFilter | 这被用于基于值进行过滤的过滤器 | 
| SkipFilter | 过滤一整行的过滤器,如果任何一个行单元格检查不满足比较条件的话 | 
| SubstringComparator | 这是基于一个值中的子字符串进行比较的比较器 | 
| TimestampsFilter | 这是一个基于数据的时间戳的过滤器 | 
| ValueFilter | 这个过滤器基于列值 | 
| WhileMatchFilter | 这个过滤器会一直继续,直到发现匹配的项 | 
使用过滤器示例
下面是使用过滤器的示例代码。
	// 使用过滤器
	public static void get(String tableName, String family, String qualifier, String substring) throws IOException {
		Table table = connection.getTable(TableName.valueOf(tableName)); // 表
		Scan scan = new Scan();
		// SubstringComparator用来判断一个给定的子字符串是否出现在给定列的单元格值中。不区分大小写
		// 对于这个比较器,只有 EQUAL或NOT_EQUAL测试是有效的
		ValueFilter valueFilter = new ValueFilter(CompareOp.EQUAL, new SubstringComparator(substring));
		scan.setFilter(valueFilter);		// 设置过滤器
		ResultScanner scanner = table.getScanner(scan);
		for (Result result : scanner) {
			byte[] value = result.getValue(Bytes.toBytes(family), Bytes.toBytes(qualifier));
			System.out.println(Bytes.toString(value));
		}
		scanner.close();
		table.close();
	}
	// 联合使用多个过滤器
	public static void get(String tableName, String family, String qualifier) throws IOException {
		Table table = connection.getTable(TableName.valueOf(tableName)); // 表
		Scan scan = new Scan();
		// 使用FilterList,组合使用多个过滤器
		FilterList filterList = new FilterList(Operator.MUST_PASS_ALL);
		filterList.addFilter(new KeyOnlyFilter());		// 指定第一个过滤器
		filterList.addFilter(new FirstKeyOnlyFilter());		// 指定第二个过滤器
		scan.setFilter(filterList);				// 设置
		
		ResultScanner scanner = table.getScanner(scan);
		for (Result result : scanner) {
			byte[] value = result.getValue(Bytes.toBytes(family), Bytes.toBytes(qualifier));
			System.out.println("查询到满足条件的值为:" + Bytes.toString(value));
		}
		scanner.close();
		table.close();
	}
        
        