2014-12-19 2 views
1

Я хочу использовать фильтр диапазона в hbase на нескольких столбцах. Я знаю, что мы можем использовать SingleColumnValueFilter, реализующий And/or Conditions, но я хочу запустить одно и то же условие фильтра для двух разных столбцов.Фильтр диапазона значений столбцов в Hbase 0.94

Пример: myhbase таблица

rowkey,cf:bidprice,cf:askprice,cf:product 

Я хочу, чтобы фильтровать все строки с (cf:bidprice>10 and cf:bidprice<20) or (cf:askprice>10 and cf:askprice<20).

ответ

1

Я думаю, что понял. Ниже приведен фрагмент кода - пример реализации.

byte[] startRow=Bytes.toBytes("startrow"); 
byte[] endRow=Bytes.toBytes("stoprow"); 

SingleColumnValueFilter bidPriceGreaterFilter=new SingleColumnValueFilter("q".getBytes(), "bidprice".getBytes(), CompareFilter.CompareOp.GREATER_OR_EQUAL, "12345".getBytes()); 
SingleColumnValueFilter bidPricelesserFilter=new SingleColumnValueFilter("q".getBytes(), "bidprice".getBytes(), CompareFilter.CompareOp.LESS_OR_EQUAL, "12346".getBytes()); 
SingleColumnValueFilter askPriceGreaterFilter=new SingleColumnValueFilter("q".getBytes(), "askprice".getBytes(), CompareFilter.CompareOp.GREATER_OR_EQUAL, "12345".getBytes()); 
SingleColumnValueFilter askPricelesserFilter=new SingleColumnValueFilter("q".getBytes(), "askprice".getBytes(), CompareFilter.CompareOp.LESS_OR_EQUAL, "12346".getBytes()); 

FilterList andFilter1= new FilterList(FilterList.Operator.MUST_PASS_ALL); 
andFilter1.addFilter(bidPriceGreaterFilter); 
andFilter1.addFilter(bidPricelesserFilter); 

FilterList andFilter2= new FilterList(FilterList.Operator.MUST_PASS_ALL); 
andFilter2.addFilter(askPriceGreaterFilter); 
andFilter2.addFilter(askPricelesserFilter); 

FilterList finalFilterList=new FilterList(FilterList.Operator.MUST_PASS_ONE); 
finalFilterList.addFilter(andFilter1); 
finalFilterList.addFilter(andFilter2); 

Scan scan = new Scan(startRow,endRow); 
scan.setFilter(finalFilterList);