- 1.运算符
< LESS
<= LESS_OR_EQUAL
= EQUAL
!= NOT_EQUAL
>= GREATER_OR_EQUAL
> GREATER
排除所有 NO_OP
- 2.过滤器组FilterList可利用过滤器组,实现sql中,and跟or的模式
//MUST_PASS_ALL必须通过所有过滤器
FilterList filterList = new FilterList(FilterList.Operator.MUST_PASS_ALL, qualifierFilter, qualifierFilter1);
//MUST_PASS_ONE只需通过一个过滤器
FilterList or = new FilterList(FilterList.Operator.MUST_PASS_ONE);
- 代码片段
/**
* get的方式取rowkey
* @param tableName
* @param type
* @param ids
* @param starttime
* @param endtime
* @return
*/
public JSONArray getResultByTsAndIdGet(String tableName, String type, String[] ids, long starttime, long endtime) {
try {
Table table = HbaseConnect.getTable(tableName);
List<Get> gets = new ArrayList<>();
long startHour = starttime - starttime % 3600;
long endHour = endtime - endtime % 3600 ;
Filter qualifierFilter = new QualifierFilter(CompareFilter.CompareOp.GREATER_OR_EQUAL
, new BinaryComparator(Bytes.toBytes(String.valueOf(starttime))));
QualifierFilter qualifierFilter1 = new QualifierFilter(CompareFilter.CompareOp.LESS_OR_EQUAL
, new BinaryComparator(Bytes.toBytes(String.valueOf(endtime))));
//过滤器组:and的模式
FilterList filterList = new FilterList(FilterList.Operator.MUST_PASS_ALL, qualifierFilter, qualifierFilter1);
for (; startHour <= endHour; startHour+=3600) {
for (String id : ids) {
String rowKey = type+"_"+ startHour+"_"+id;
Get get = new Get(rowKey.getBytes());
get.setFilter(filterList);
gets.add(get);
}
}
Result[] results = table.get(gets);
JSONArray resultList = new JSONArray();
for (Result result : results) {
List<KeyValue> list = result.list();
if(list==null){
continue;
}
list.stream().forEach(kv -> {
resultList.add(JSON.parseObject(new String(kv.getValue())));
});
}
table.close();
return resultList;
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
/**
* scan的方式取,速度比较慢
* @param tableName
* @param type
* @param ids
* @param starttime
* @param endtime
* @return
*/
public JSONArray getResultByTimestampAndId(String tableName, String type, String[] ids, long starttime, long endtime) {
// 按rowkey的前缀过滤
// Filter prefixFilter=new PrefixFilter(Bytes.toBytes("1_"));
//按列的值过滤,'>='并且'<='
Filter qualifierFilter = new QualifierFilter(CompareFilter.CompareOp.GREATER_OR_EQUAL
, new BinaryComparator(Bytes.toBytes(String.valueOf(starttime))));
QualifierFilter qualifierFilter1 = new QualifierFilter(CompareFilter.CompareOp.LESS_OR_EQUAL
, new BinaryComparator(Bytes.toBytes(String.valueOf(endtime))));
//正则匹配id--过滤器组:or模式
FilterList or = new FilterList(FilterList.Operator.MUST_PASS_ONE);
for (String id : ids) {
RowFilter rowFilter = new RowFilter(CompareFilter.CompareOp.EQUAL,
new RegexStringComparator(".*" + id + "$"));
or.addFilter(rowFilter);
}
//过滤器组:and模式
FilterList filterList = new FilterList(FilterList.Operator.MUST_PASS_ALL, qualifierFilter, qualifierFilter1, or);
ResultScanner results = HbaseUtil.getScannerFilter(tableName,
getStartKey(type, starttime),
getEndKey(type, endtime),
filterList);
JSONArray resultList = new JSONArray();
results.forEach(result -> {
List<KeyValue> list = result.list();
list.stream().forEach(kv -> {
resultList.add(JSON.parseObject(new String(kv.getValue())));
});
});
return resultList;
}