HBase总结(6)--比较过滤器

一、介绍

比较过滤器是一种专门的用于比较的过滤器,通过实现比较运算符与比较器,来实现用户的需求

二、详解

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

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值