一、介绍
比较过滤器是一种专门的用于比较的过滤器,通过实现比较运算符与比较器,来实现用户的需求
二、详解
1、行过滤器
该种过滤器主要对行值(row)进行过滤,不符合条件的row的行将要被过滤掉。
public void testRowFilter(String tableName,CompareOp compareOp,ByteArrayComparable compare)
{
Configuration conf=init();
try {
//创建表连接
HTable table=new HTable(conf, tableName);
//创建一个scan对象
Scan scan=new Scan();
//创建一个rowfilter,并对其进行赋值
RowFilter filter=new RowFilter(compareOp, compare);
scan.setFilter(filter);
//进行输出查询
ResultScanner rs=table.getScanner(scan);
Result result=null;
while((result=rs.next())!=null)
{
KeyValue[] kvs=result.raw();
for(KeyValue kv:kvs)
{
System.out.println(kv.toString());
}
}
rs.close();
table.close();
} catch (Exception e) {
// TODO: handle exception
}
}
public static void main(String[] args)
{
RowFilterExaple exaple=new RowFilterExaple();
exaple.testRowFilter("test",CompareOp.LESS_OR_EQUAL,new BinaryComparator(Bytes.toBytes("row-5")));
}
该段代码的意思为:获取row值小于等于row-5的行进行显示。其他的被过滤掉。
注意:因为在对比时使用compareTo()函数对二进制进行比较,因此会出现 row-10 是小于 row-5 值,因为转换成字节数组以后,1 是小于 5 的。
2、列簇过滤器:FamilyFilter
该过滤器是对列簇进行过滤,即在获取数据过程中,不符合该过滤器条件的列簇内的数据,全部过滤掉。
public void exapmle(String tableName)
{
Configuration conf=init();
try {
HTable table=new HTable(conf, tableName);
//创建scan对象
Scan scan=new Scan();
//添加列簇过滤器
FamilyFilter filter=new FamilyFilter(CompareOp.EQUAL,new SubstringComparator("t"));
scan.setFilter(filter);
//进行获取
ResultScanner rs=table.getScanner(scan);
Result result=null;
while((result=rs.next())!=null)
{
KeyValue[] kvs=result.raw();
for(KeyValue kv:kvs)
{
System.out.println(kv.toString());
}
}
//关闭扫描器
rs.close();
//关闭表连接
table.close();
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
}
该段代码的意思为:名称中含有字母‘t’的列簇中的数据可以被返回到客户端。
3、列明过滤器:QualifierFilter
列名过滤器主要是对扫描到的所有数据的列进行过滤,符合条件的列的数据被返回到客户端,不合符责备过滤掉
public void example(String tableName)
{
Configuration conf=init();
try {
HTable table=new HTable(conf, tableName);
//生成scan对象
Scan scan=new Scan();
//创建过滤器
//使用 二进制前缀比较器
QualifierFilter filter=new QualifierFilter(CompareOp.EQUAL,new BinaryPrefixComparator(Bytes.toBytes("test")));
//添加过滤器
scan.setFilter(filter);
//获取数据
ResultScanner rs=table.getScanner(scan);
//展示数据
Result result=null;
while((result=rs.next())!=null)
{
KeyValue[] kvs=result.raw();
for(KeyValue kv:kvs)
{
System.out.println(kv.toString());
}
}
//释放资源
rs.close();
table.close();
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
}
列名等于test的列的数据被返回到客户端。其他列的数据过滤掉。
4、值过滤器:ValueFilter
对返回来的数据的值进行过滤,只有符合条件的KeyValue键值对才会被返回。
public void example(String tableName)
{
Configuration conf=init();
try {
//创建表连接
HTable table=new HTable(conf, tableName);
//创建scan
Scan scan=new Scan();
//创建值过滤器
ValueFilter filter=new ValueFilter(CompareOp.NOT_EQUAL,new NullComparator());
//添加过滤器
scan.setFilter(filter);
//进行数据湖区
ResultScanner rs=table.getScanner(scan);
//进行数据展示
Result result=null;
while((result=rs.next())!=null)
{
KeyValue[] kvs=result.raw();
for(KeyValue kv:kvs)
{
System.out.println(Bytes.toString(kv.getValue()));
}
}
//关闭数据源
rs.close();
table.close();
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
}
值不为空的KeyValue对象才能够被返回到客户端,为空的Keyvalue键值对被过滤掉
5、参考列过滤器:DependentColumnFilter
该过滤器不同于上述的过滤器的使用方法,其初始化参数会多一些:
DependentColumnFilter(byte[] family,byte[] qualifier)
DependentColumnFilter(byte[] family,byte[] qualifier,boolean dropDependentColumn)
DependentColumnFilter(byte[] family,byte[] qualifier,boolean dropDependentColumn,CompareOp compareOp,ByteArrayComparable compare)
该中过滤器在没有设置最后两个参数时,相当于一个时间戳过滤器,即获取制定列中的所有时间戳。在进行过滤时,当一个KeyValue值的时间戳与过滤器中的时间戳(过滤器中可能含有多个时间戳,只需要匹配一个即可)不相同时,该KeyValue对象立刻被过滤掉。而dropDependentColumn参数则是指定是否将制定列中的数据过滤掉。true时,则不返回指定列的数据,否认将指定列中的数据返回到客户端。
当过滤器设置了后两个参数,则首先对指定列中的数据进行过滤,则符合条件的数据的时间戳才会被过滤器获取,然后过滤器才对同行其他列、或者其他行中的所有的列进行数据过滤。
因为数据问题,并没有相应的代码进行测试。下面的连接中展示了该过滤器的使用方法:
http://www.thebigdata.cn/HBase/15872.html