1. 程式人生 > >HBase總結(8)--附加過濾器、FilterList

HBase總結(8)--附加過濾器、FilterList

一、介紹

本節介紹HBase提供的最後兩種過濾器,並且也介紹多個過濾器配合使用的方法。

二、詳解

1、附加過濾器

(1)跳轉過濾器:SkipFilter(Filter filter)

該過濾器的引數為一個過濾器。該過濾器的作用為:當引數中的過濾器過濾一個某一個KeyValue物件時,則跳轉過濾器會將整行的資料進行過濾。

public void example(String tableName)
	{
		Configuration conf=init();
		try {
			HTable table=new HTable(conf, tableName);
			//建立過濾器
			ValueFilter filter=new ValueFilter(CompareOp.NOT_EQUAL,new BinaryComparator(Bytes.toBytes("row-10")));
			SkipFilter skipFilter=new SkipFilter(filter);
			Scan scan=new Scan();
			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
		}
	}

(2)全匹配過濾器:WhileMatchFilter(Filter filter)

該過濾器需要填入一個過濾器作為引數。

該過濾器的作用於跳轉過濾器相似,不過該過濾器當遇到第一個過濾整行資料的時候則會停止掃描過程。這樣即使後面有資料符合條件也不會被傳送到客戶端。

public void example(String tableName)
	{
		Configuration conf=init();
		try {
			HTable table=new HTable(conf, tableName);
			//建立過濾器
			ValueFilter filter=new ValueFilter(CompareOp.NOT_EQUAL,new BinaryComparator(Bytes.toBytes("row-10")));
			WhileMatchFilter filter=new WhileMatchFilter(filter);
			Scan scan=new Scan();
			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
		}
	}

2、FilterList:過濾器容器

FilterList的作用就是為了多個filter配合使用,因為在scan中,只能設定一個filter,因此在需要使用多個filter物件時,就需要使用FilterList容器將所有的filter裝入,然後傳入scan物件中。在Filterlist物件中,提供了多個filter的過濾關係:

(1)MUST_PASS_ALL :一行資料必須通過所有的過濾器才能被返回客戶端

(2)MUST_PASS_ONE:一行資料中只要通過一個過濾器即可返回給客戶端

在初始化FilterList物件時,可以進行模式的設定,FilterList物件的建構函式有三個:

FilterList(List<Filter> rowFilters)

FilterList(Operator operator)

FilterList(Operator operator,List<Filter> rowFilters)

public void mutilRowFilter(String tableName,CompareOp[] compareOps,ByteArrayComparable[] comparables)
	{
		Configuration conf=init();
		try {
			//建立表連線
			HTable table=new HTable(conf, tableName);
			//建立scan
			Scan scan=new Scan();
			int length=compareOps.length;
			FilterList filterList=new FilterList(FilterList.Operator.MUST_PASS_ALL);
			for(int i=0;i<length;i++)
			{
				RowFilter filter=new RowFilter(compareOps[i], comparables[i]);
				filterList.addFilter(filter);
			}
			scan.setFilter(filterList);
			//執行返回結果
			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();
		}
	}