多条件过滤
关键代码
通过下面代码,将多个 filter 组合起来:
FilterList fl=new FilterList(FilterList.Operator.MUST_PASS_ALL,startFilter,endFilter);
解释:
FilterList.Operator.MUST_PASS_ALL
相当于 SQL 中的and
FilterList.Operator.MUST_PASS_ONE
相当于 SQL 中的or
完整代码
/**
* @param tableName
* @param columnFamily1 第一个条件的列族名
* @param column1 第一个条件的列名
* @param op1 第一个条件的操作符
* @param value1 第一个条件的值
* @param filterIfMissing1 第一个条件的filterIfMissing,true 表示没有列值,认为不满足条件;false,没有列值,也满足条件
* @param columnFamily2 第二个条件的列族名
* @param column2 第二个条件的列名
* @param op2 第二个条件的操作符
* @param value2 第二个条件的值
* @param filterIfMissing2 第二个条件的filterIfMissing,true 表示没有列值,认为不满足条件;false,没有列值,也满足条件
* @return
* @throws IOException
*/
public List<CellData[]> filter(String tableName,
String columnFamily1, String column1, String op1, String value1, boolean filterIfMissing1,
String columnFamily2, String column2, String op2, String value2, boolean filterIfMissing2) throws IOException {
Table table = conn.getTable(TableName.valueOf(tableName));
//创建Scan
Scan scan = new Scan();
SingleColumnValueFilter startFilter = new SingleColumnValueFilter(
Bytes.toBytes(columnFamily1),
Bytes.toBytes(column1),
getCompareOperator(op1),
new BinaryComparator(Bytes.toBytes(value1))); // 注意是字符串
startFilter.setFilterIfMissing(filterIfMissing1);
SingleColumnValueFilter endFilter = new SingleColumnValueFilter(
Bytes.toBytes(columnFamily2),
Bytes.toBytes(column2),
getCompareOperator(op2),
new BinaryComparator(Bytes.toBytes(value2))); // 注意是字符串
endFilter.setFilterIfMissing(filterIfMissing2);
//构建过滤list,MUST_PASS_ALL 相当于 sql 中的 and
FilterList fl = new FilterList(FilterList.Operator.MUST_PASS_ALL, startFilter, endFilter);
//传入FilterList
scan.setFilter(fl);
//执行scan
ResultScanner resultScanner = table.getScanner(scan);
Iterator<Result> iterator = resultScanner.iterator();
List<CellData[]> retList = new ArrayList<>();
//迭代,在迭代时,ResultScanner会发送get请求
while (iterator.hasNext()) {
Result result = iterator.next();
//获取rowkey
String rowkey = Bytes.toString(result.getRow());
// System.out.print(rowkey+"\t");
//获取所有单元格
List<Cell> list = result.listCells();
CellData[] arr = new CellData[list.size()];
int i = 0;
for (Cell item : list) {
String family = Bytes.toString(CellUtil.cloneFamily(item));
String qualifier = Bytes.toString(CellUtil.cloneQualifier(item));
String valueDb = Bytes.toString(CellUtil.cloneValue(item));
CellData cellData = new CellData(family, qualifier, rowkey, item.getTimestamp(), valueDb);
arr[i] = cellData;
i++;
}
retList.add(arr);
}
//用完要及时关闭,在迭代时,ResultScanner会发送get请求
resultScanner.close();
table.close();
return retList;
}
测试
public static void main(String[] args) throws IOException {
HbaseUtils2_filter2 utils = new HbaseUtils2_filter2();
utils.connect();
// 查询 price 小于等于 099.90的数据
List<CellData[]> resList = utils.filter("book",
"c1", "price", ">=", "059.00", true,
"c1", "price", "<=", "099.90", true);
for (CellData[] arr : resList) {
for (CellData item : arr) {
System.out.print(item.getFamily() + ":" + item.getRowkey() + ":" + item.getQualifier() + " == " + item.getValue() + "\t\t");
}
System.out.println();
}
utils.close();
}