一、建表
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
”的列数据。