- 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;
}