Hbase中内置Filter详解

本文详细介绍了HBase中的多种内置Filter,包括RowFilter、QualifierFilter、PrefixFilter等,通过实例展示了如何使用这些Filter进行数据筛选。FilterList的使用也进行了说明,解释了如何结合多个Filter进行“AND”或“OR”操作来满足复杂查询需求。
摘要由CSDN通过智能技术生成

一、建表

1、表名:“ORDER_TABLE

2、列簇:“user”,“order”,“item

3、表结构如下:

 

二、封装服务

服务代码如下:

@Override
	public String get(String tableName, Filter filter) {
		Scan scan = new Scan();
		scan.setFilter(filter);
		return htemplate.find(tableName, scan, new ResultsExtractor<String>() {

			@Override
			public String extractData(ResultScanner results) throws Exception {
				for(Result res : results){  
		            for(Cell cell : res.rawCells()){  
		                System.out.println("KV: " + cell + ", Value: " + Bytes.toString(CellUtil.cloneValue(cell)));  
		            }  
		            System.out.println("------------------------------------------------------------");  
		        }
				return "chhliu";
			}
		});
	}

三、内置Filter的使用

Hbase中支持的内置Filter列表如下:


1、RowFilter使用

说明:筛选出匹配的所有的行,支持基于行键过滤数据,可以执行精确匹配,子字符串匹配或正则表达式匹配,过滤掉不匹配的数据。

用法:使用BinaryComparator可以筛选出具有某个行键的行,或者通过改变比较运算符来筛选出符合某一条件的多条数据

示例:

Filter filter = new RowFilter(CompareFilter.CompareOp.EQUAL, new BinaryComparator(Bytes.toBytes("firstRow")));

测试结果:

KV: firstRow/item:name/1479788712670/Put/vlen=5/mvcc=0, Value: maoyi
KV: firstRow/item:price/1479788739567/Put/vlen=3/mvcc=0, Value: 100
KV: firstRow/item:type/1479788725903/Put/vlen=4/mvcc=0, Value: yifu
KV: firstRow/order:num/1479788660941/Put/vlen=1/mvcc=0, Value: 1
KV: firstRow/order:payType/1479788691846/Put/vlen=5/mvcc=0, Value: check
KV: firstRow/order:totalPrice/1479788676517/Put/vlen=3/mvcc=0, Value: 100
KV: firstRow/user:address/1479788610153/Put/vlen=9/mvcc=0, Value: chongqing
KV: firstRow/user:name/1479788577571/Put/vlen=6/mvcc=0, Value: chhliu
KV: firstRow/user:password/1479788593494/Put/vlen=6/mvcc=0, Value: 123456

从测试结果可以看出,扫描出了所有“firstRow”行的数据。

总结:

RowFilter的使用关键在于CompareFilter.CompareOp这个内部枚举类,该类的定义如下:

@InterfaceAudience.Public
  @InterfaceStability.Stable
  public enum CompareOp {
    /** less than */
    LESS,  // 检查是否小于比较器里的值
    /** less than or equal to */
    LESS_OR_EQUAL,  // 检查是否小于或等于比较器里的值
    /** equals */
    EQUAL,  // 检查是否等于比较器里的值
    /** not equal */
    NOT_EQUAL, // 检查是否不等于比较器里的值
    /** greater than or equal to */
    GREATER_OR_EQUAL,  // 检查是否大于或等于比较器里的值
    /** greater than */
    GREATER,  // 检查是否大于比较器里的值
    /** no operation */
    NO_OP,  // 默认返回false,因此过滤掉所有的数据
  }

该枚举类定义了7中比较运算符,供我们扫描操作

2、QualifierFilter使用

说明:该Filter是一种类似RowFilter的比较过滤器,不同之处是它用来匹配列限定符而不是行健

示例:

Filter filter = new QualifierFilter(CompareFilter.CompareOp.EQUAL, new RegexStringComparator("name"));

测试结果:

KV: firstRow/item:name/1479788712670/Put/vlen=5/mvcc=0, Value: maoyi
KV: firstRow/user:name/1479788577571/Put/vlen=6/mvcc=0, Value: chhliu
------------------------------------------------------------
KV: secondRow/item:name/1479788846563/Put/vlen=4/mvcc=0, Value: kuzi
KV: secondRow/user:name/1479788961691/Put/vlen=6/mvcc=0, Value: xyh123
从上面的测试结果可以看出,扫描出了所有的列名为“ name ”的列数据。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值