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