天天看點

HBase Filter 過濾器之RowFilter詳解

前言:本文詳細介紹了HBase RowFilter過濾器Java&Shell API的使用,并貼出了相關示例代碼以供參考。RowFilter 基于行鍵進行過濾,在工作中涉及到需要通過HBase Rowkey進行資料過濾時可以考慮使用它。比較器細節及原理請參照之前的更文:HBase Filter 過濾器之比較器 Comparator 原理及源碼學習

一。Java Api

頭部代碼

public class RowFilterDemo {

private static boolean isok = false;
private static String tableName = "test";
private static String[] cfs = new String[]{"f"};
private static String[] data = new String[]{"row-ac:f:c1:v1", "row-ab:f:c2:v2", "row-bc:f:c3:v3", "row-abc:f:c4:v4"};

public static void main(String[] args) throws IOException {

    MyBase myBase = new MyBase();
    Connection connection = myBase.createConnection();
    if (isok) {
        myBase.deleteTable(connection, tableName);
        myBase.createTable(connection, tableName, cfs);
        myBase.putRows(connection, tableName, data); // 造資料
    }
    Table table = connection.getTable(TableName.valueOf(tableName));
    Scan scan = new Scan();           

中部代碼 向右滑動滾動條可檢視輸出結果。

  1. BinaryComparator 構造過濾器

    RowFilter rowFilter = new RowFilter(CompareFilter.CompareOp.EQUAL, new BinaryComparator(Bytes.toBytes("row-ac"))); // [row-ac]

    RowFilter rowFilter = new RowFilter(CompareFilter.CompareOp.NOT_EQUAL, new BinaryComparator(Bytes.toBytes("row-ac"))); // [row-ab, row-abc, row-bc]

    RowFilter rowFilter = new RowFilter(CompareFilter.CompareOp.GREATER, new BinaryComparator(Bytes.toBytes("row-ac"))); // [row-bc]

    RowFilter rowFilter = new RowFilter(CompareFilter.CompareOp.GREATER_OR_EQUAL, new BinaryComparator(Bytes.toBytes("row-ac"))); // [row-ac, row-bc]

    RowFilter rowFilter = new RowFilter(CompareFilter.CompareOp.LESS, new BinaryComparator(Bytes.toBytes("row-ac"))); // [row-ab, row-abc]

    RowFilter rowFilter = new RowFilter(CompareFilter.CompareOp.LESS_OR_EQUAL, new BinaryComparator(Bytes.toBytes("row-ac"))); // [row-ab, row-abc, row-ac]

  2. BinaryPrefixComparator 構造過濾器

    RowFilter rowFilter = new RowFilter(CompareFilter.CompareOp.EQUAL, new BinaryPrefixComparator(Bytes.toBytes("row-a"))); // [row-ab, row-abc, row-ac]

    RowFilter rowFilter = new RowFilter(CompareFilter.CompareOp.NOT_EQUAL, new BinaryPrefixComparator(Bytes.toBytes("row-a"))); // [row-bc]

    RowFilter rowFilter = new RowFilter(CompareFilter.CompareOp.GREATER, new BinaryPrefixComparator(Bytes.toBytes("row-a"))); // [row-bc]

    RowFilter rowFilter = new RowFilter(CompareFilter.CompareOp.GREATER_OR_EQUAL, new BinaryPrefixComparator(Bytes.toBytes("row-a"))); // [row-ab, row-abc, row-ac, row-bc]

    RowFilter rowFilter = new RowFilter(CompareFilter.CompareOp.LESS, new BinaryPrefixComparator(Bytes.toBytes("row-a"))); // []

    RowFilter rowFilter = new RowFilter(CompareFilter.CompareOp.LESS_OR_EQUAL, new BinaryPrefixComparator(Bytes.toBytes("row-a"))); // [row-ab, row-abc, row-ac]

  3. SubstringComparator 構造過濾器

    RowFilter rowFilter = new RowFilter(CompareFilter.CompareOp.EQUAL, new SubstringComparator("ab")); // [row-ab, row-abc]

    RowFilter rowFilter = new RowFilter(CompareFilter.CompareOp.NOT_EQUAL, new SubstringComparator("ab")); // [row-ac, row-bc]

  4. RegexStringComparator 構造過濾器

    RowFilter rowFilter = new RowFilter(CompareFilter.CompareOp.NOT_EQUAL, new RegexStringComparator("abc")); // [row-ab, row-ac, row-bc]

    RowFilter rowFilter = new RowFilter(CompareFilter.CompareOp.EQUAL, new RegexStringComparator("abc")); // [row-abc]

    RowFilter rowFilter = new RowFilter(CompareFilter.CompareOp.EQUAL, new RegexStringComparator("a")); // [row-ab, row-abc, row-ac]

  5. NullComparator 構造過濾器

    RowFilter rowFilter = new RowFilter(CompareFilter.CompareOp.EQUAL, new NullComparator()); // []

    RowFilter rowFilter = new RowFilter(CompareFilter.CompareOp.NOT_EQUAL, new NullComparator()); // [row-ab, row-abc, row-ac, row-bc]

尾部代碼

scan.setFilter(rowFilter);
    ResultScanner scanner = table.getScanner(scan);
    Iterator<Result> iterator = scanner.iterator();
    LinkedList<String> rowkeys = new LinkedList<>();
    while (iterator.hasNext()) {
        Result result = iterator.next();
        String rowkey = Bytes.toString(result.getRow());
        rowkeys.add(rowkey);
    }
    System.out.println(rowkeys);
    scanner.close();
    table.close();
    connection.close();
}           

}

二。Shell Api

方式一:

hbase(main):006:0> scan 'test',{FILTER=>"RowFilter(=,'binary:row-ab')"}

ROW COLUMN+CELL

row-ab column=f:c2, timestamp=1588156704669, value=v2

1 row(s) in 0.0140 seconds

支援的比較運算符:= != > >= < <=,不再一一舉例。

方式二:

import org.apache.hadoop.hbase.filter.CompareFilter

import org.apache.hadoop.hbase.filter.BinaryComparator

import org.apache.hadoop.hbase.filter.RowFilter

hbase(main):016:0> scan 'test',{FILTER => RowFilter.new(CompareFilter::CompareOp.valueOf('EQUAL'), BinaryComparator.new(Bytes.toBytes('row-ab')))}

1 row(s) in 0.0310 seconds

支援的比較運算符:LESS、LESS_OR_EQUAL、EQUAL、NOT_EQUAL、GREATER、GREATER_OR_EQUAL,不再一一舉例。

推薦使用方式一,更簡潔友善。

hbase(main):023:0> scan 'test',{FILTER=>"RowFilter(=,'binaryprefix:row-ab')"}

row-abc column=f:c4, timestamp=1588156704669, value=v4

2 row(s) in 0.0360 seconds

import org.apache.hadoop.hbase.filter.BinaryPrefixComparator

hbase(main):027:0> scan 'test',{FILTER => RowFilter.new(CompareFilter::CompareOp.valueOf('EQUAL'), BinaryPrefixComparator.new(Bytes.toBytes('row-ab')))}

2 row(s) in 0.0110 seconds

其它同上。

hbase(main):001:0> scan 'test',{FILTER=>"RowFilter(=,'substring:row-ab')"}

2 row(s) in 0.3200 seconds

import org.apache.hadoop.hbase.filter.SubstringComparator

hbase(main):007:0> scan 'test',{FILTER => RowFilter.new(CompareFilter::CompareOp.valueOf('EQUAL'), SubstringComparator.new('row-ab'))}

2 row(s) in 0.0230 seconds

差別于上的是這裡直接傳入字元串進行比較,且隻支援EQUAL和NOT_EQUAL兩種比較符。

import org.apache.hadoop.hbase.filter.RegexStringComparator

hbase(main):007:0> scan 'test',{FILTER => RowFilter.new(CompareFilter::CompareOp.valueOf('EQUAL'), RegexStringComparator.new('row-ab'))}

該比較器直接傳入字元串進行比較,且隻支援EQUAL和NOT_EQUAL兩種比較符。若想使用第一種

賣手遊賬号

方式可以傳入regexstring試一下,我的版本有點低暫時不支援,不再示範了。

注意這裡的正則比對指包含關系,對應底層find()方法。

此外,RowFilter 不支援使用LongComparator比較器,且BitComparator、NullComparator 比較器用之甚少,也不再介紹。