Hbase 0.94中的列值范围过滤器 [英] Column Value Range Filter in Hbase 0.94

查看:448
本文介绍了Hbase 0.94中的列值范围过滤器的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想在多个列上使用hbase中的范围过滤器。我知道我们可以使用SingleColumnValueFilter实现和/或条件,但我想运行相同的过滤条件对两个不同的列。



示例:myhbase表



$ p $ rowkey,cf:bidprice,cf:askprice,cf:product

我想用(cf:bidprice> 10和cf:bidprice< 20)或(cf:askprice> 10和cf:askprice< 20 )

解决方案

我想我明白了。下面的代码片段是一个示例实现。

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

扫描扫描=新扫描(startRow,endRow);
scan.setFilter(finalFilterList);


I want to use a range filter in hbase on more than one column . I know we can use SingleColumnValueFilter implementing And/Or Conditions but I want to run the same filter condition against two different columns.

Example:myhbase table

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

I want to filter all the rows with (cf:bidprice>10 and cf:bidprice<20) or (cf:askprice>10 and cf:askprice<20).

解决方案

I think I figured it out. Below code snippet is an example implementation.

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

这篇关于Hbase 0.94中的列值范围过滤器的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆