1. 程式人生 > >HBase總結(6)--比較過濾器

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