閱讀311 返回首頁    go 阿裏雲 go 技術社區[雲棲]


Hbase 過濾器

HBase的基本API,包括增刪改查等,增和刪是相對簡單的操作,與傳統的RDBMS相比較,這裏的查詢操作略顯蒼白,隻能根據特性的行鍵進行查詢(get) 或者根據行鍵的範圍來查詢(Scan).
HBase不僅提供了這些簡單的查詢,而且提供了更加高級的過濾器(Filter)來查詢.
通過這些過濾器可以在HBase中的數據的多個維度(行,列,數據版本)上進行對數據的篩選操作,也就是說過濾器最終能夠篩選數據能夠細化到具體的存儲單元格上(由行鍵,列簇,時間戳定位).
HBase過濾器的類型很多,但是可以分為兩大類:比較過濾器,專用過濾器.

比較過濾器 通用比較器1

比較器作為過濾氣的核心組成之一,用於處理具體的比較邏輯,列入字節級的比較,字符串的比較等.
BinaryComparator
二級製比較器,用於按字典順序比較Byte數據值
BinaryPrefixComparator
前綴二進製比較器 按前綴比較
NullComparator
判斷給定的是否為空
BitComparator
按位比較
RegexStringComparator
支持正則表達式的值比較,僅支持EQUAL和非EQUAL
SubStringComparator
判斷提供的子串是否出現在value中 不區分大小寫

比較過濾器,通用操作符
LESS <
LESS_OR_EQUAL <=
EQUAL =
NOT_EQUAL<>
GREATER_OR_EQUAL>=
GREATER >
NO_OP 排除所有


比較過濾器 行鍵過濾器
RowFilter
刪除行鍵匹配的所有的行
語法
RowFilter(操作符,比較器)
性能
一般來講,執行Scan使用startRow/stopRow方式比較好

FamilyFilter
篩選出列簇匹配的數據
返回數據的單位是Cell 而不是整行數據
語法
familyFilter(操作符,比較)
性能
通常在Scan過程中通過設定某列列簇來實現該功能而不是直接使用該過濾器

QualifierFilter
篩選子列匹配的數據
返回數據的單位是Cell而不是整形數據
語法
QualifierFilter(操作符,比較器)


public class HbaseScanTest {
//創建配置鏈接
    private Configuration configuration = HBaseConfiguration.create();
    private Connection connection;
//聲明表
    private Table bd17Test;
//在方法的構造體中 初始化數據 鏈接hbase和鏈接到table的表上
    public HbaseScanTest() throws IOException {

        connection = ConnectionFactory.createConnection(configuration);
        bd17Test = connection.getTable(TableName.valueOf("bd17:fromjava"));
    }

    // scan test 這個方法用於測試scan 和過濾的
    public void scanData() throws IOException {
        Scan scan = new Scan();
//resultScanner 的next方法返回查詢結果集中的下一條數據 ,如果沒有下一條數據
//則next返回結果是null
//輸出條件從 row的rowKey_2開始到row為rowKey_5結束不包含rowKey_5
        scan.setStartRow(Bytes.toBytes("rowKey_2"));
        scan.setStopRow(Bytes.toBytes("rowKey_5"));

        ResultScanner rs = bd17Test.getScanner(scan);
        Result result = rs.next();
        while (result != null) {
            CellScanner cs =result.cellScanner();
            System.out.println("rowKey:"+Bytes.toString(result.getRow()));
        while(cs.advance()){
            Cell cell =cs.current();
            String family =Bytes.toString(CellUtil.cloneFamily(cell));
            String qualify =Bytes.toString(CellUtil.cloneQualifier(cell));
            String value =Bytes.toString(CellUtil.cloneValue(cell));
            System.out.println("family"+family+"qualify"+qualify+"value"+value);
        }
            result = rs.next();
        }
    }
    public static void main(String[] args) throws IOException {
        HbaseScanTest hbaseScanTest =new HbaseScanTest();
        hbaseScanTest.scanData();
}   
}
public class HbaseScanTest {

    private Configuration configuration = HBaseConfiguration.create();

    private Connection connection;
    private Table bd17Test;

    public HbaseScanTest() throws IOException {

        connection = ConnectionFactory.createConnection(configuration);
        bd17Test = connection.getTable(TableName.valueOf("bd17:fromjava"));
    }
//rowfilter
    //獲取rowkey中包含row的數據(這個方法被注釋了)
    public void getByRowFilter() throws IOException{
    //首先構建sanner
        Scan scan =new Scan();
//      RowFilter rowFilter =new RowFilter(CompareFilter.CompareOp.EQUAL, new RegexStringComparator("row"));
        //把過濾器加入到scan中
//      scan.setFilter(rowFilter);
        //把san加入到table上進行掃描獲取resultscanner結果
//      ResultScanner rScanner =bd17Test.getScanner(scan);
//      ShowResult(rScanner);

        //獲取rowkey<rowKey_5並且包含rowKey_5>
        RowFilter ltRowFilter =new RowFilter(CompareFilter.CompareOp.LESS_OR_EQUAL, new BinaryComparator(Bytes.toBytes("rowKey_5")));
        scan.setFilter(ltRowFilter);
        ResultScanner rScanner =bd17Test.getScanner(scan);
        ShowResult(rScanner);

    }
    //輸出的整個太過麻煩將其封裝成方法而已
    public void ShowResult(ResultScanner rs) throws IOException{
        Result result = rs.next();
        while (result != null) {
            CellScanner cs =result.cellScanner();
            System.out.println("rowKey:"+Bytes.toString(result.getRow()));
        while(cs.advance()){
            Cell cell =cs.current();
            String family =Bytes.toString(CellUtil.cloneFamily(cell));
            String qualify =Bytes.toString(CellUtil.cloneQualifier(cell));
            String value =Bytes.toString(CellUtil.cloneValue(cell));
            System.out.println("family:"+family+"  qualify:"+qualify+"  value:"+value);
        }
            result = rs.next();
        }
    }
    //familyfilter返回的是設置是列簇的數據
    public void getFamilyFilter() throws IOException{
        Filter famliyFilter = new FamilyFilter(CompareOp.EQUAL.LESS, new BinaryComparator(Bytes.toBytes("j")));
        Scan scan =new Scan();
        scan.setFilter(famliyFilter);
        ResultScanner rs= bd17Test.getScanner(scan);
        ShowResult(rs);
    }
    //getByQualifyFilter l列名稱過濾器 隻返回能批匹配的列名稱的單元格數據
    public void getByQualifyFilter() throws IOException{
        org.apache.hadoop.hbase.filter.Filter qualifyFilter =new QualifierFilter(CompareOp.EQUAL, new BinaryPrefixComparator(Bytes.toBytes("tele")));
        Scan scan =new Scan();
        scan.setFilter(qualifyFilter);
        ResultScanner rs =bd17Test.getScanner(scan);
        ShowResult(rs);
    }
    public static void main(String[] args) throws IOException {
        HbaseScanTest hbaseScanTest =new HbaseScanTest();
//      hbaseScanTest.scanData();

        hbaseScanTest.getByRowFilter();
        hbaseScanTest.getFamilyFilter();
            hbaseScanTest.getByQualifyFilter();
}

比較過濾器 子列範圍過濾器

CloumnRangeFilter
--該過濾器用獲取一個指定子列範圍內的所有Cell

語法

--columnRangeFilter(子列起始值,是否包含起始值,子列結束值,是否包含結束值)

性能
--該過濾器可以進行高效的子列內部掃描(因為子列是已經按字典排序好的)

public void getByClumnRangeFilter() throws IOException{
        Filter cRangeFilter =new ColumnRangeFilter(Bytes.toBytes("o_name1"), true, Bytes.toBytes("o_name2"),true);
        Scan scan =new Scan();
        scan.setFilter(cRangeFilter);
        ResultScanner rs =bd17Test.getScanner(scan);
        ShowResult(rs);     
    }

比較過濾器 列值過濾器

ValueFilter
--篩選出劣質匹配的數據
--返回數據的單位是Cell,而不是整行數據
語法
--ValueFilter(操作符,比較器)


    //按照姓名查找用戶信息 隻返回能匹配上的列值單元格的數據
    public void GetBySearchValue() throws IOException{
        Filter getBySearchValue =new ValueFilter(CompareOp.EQUAL, new RegexStringComparator("n_6"));

        Scan scan =new Scan();
        scan.setFilter(getBySearchValue);
        ResultScanner rs =bd17Test.getScanner(scan);
        ShowResult(rs);

    }

行健前綴過濾器

PreFixFilter
---篩選出行健前綴匹配的所有的行
語法
---PrefixFilter(行健前綴)

public void getPrefilter() throws IOException{
        Filter cPreFilter =new PrefixFilter(Bytes.toBytes("xisi"));
        Scan scan =new Scan();
        scan.setFilter(cPreFilter);
        ResultScanner rs =bd17Test.getScanner(scan);
        ShowResult(rs);

    }

專用過濾器 子列前綴過濾器
ColumnPrefixFilter
篩選出包含前綴的所有子列
返回數據的單位是Cell 而不是整行數據一般來講
語法
ColumnPrefixFilter(前綴)
new ColumnPrefixFilter(Bytes.toBytes("cloumn"))

篩選所有以column開頭子列cell

專用過濾器 多子列前綴過濾器器
MultpleColumnPrefixFilter
MultipleColumnPrefixFilter 與 ColumnPrefixFilter 的行為類似,但可以指定多個子列前綴
語法
MultipleColumnPrefixFilter(前綴byte二維數組)
byte[][] prefixes = new byte[][]{Bytes.toBytes("column 1"), Bytes.toBytes("column2")}
new MultipleColumnPrefixFilter (prefixes)
篩選出所有以column1和column2開頭子列的cell

專用過濾器 列綜合過濾器

DependentColumnFilter
該過濾器嚐試找到該列簇、子列所在的Cell。
語法
DependentColumnFilter(列簇、子列)
示例代碼
new DependentColumnFilter(
Bytes.toBytes("family1"), Bytes.toBytes("column1"))
篩選出所有列簇family1、子列column1的所有Cell

FilterList
該過濾器代表一個過濾器鏈 ,它可以包含一組即將應用於目標數據集的過濾器,過濾器間具有“與”和“或”關係。
語法
FilterList(列關係、過濾器集合)
FilterList.Operator.MUST_PASS_ ALL 關係與
FilterList.Operator.MUST_PASS_ ONE 關係或

通過Hbase的過濾器,我們可以在HBase中的數據多個維度(行,列,數據版本)上進行對數據的篩選操作。
Hbase大致上可以分為比較過濾器和專用過濾器。
比較過濾器有行健過濾器、列簇過濾器、子列過濾器、子列範圍過濾器、列值過濾器。
專用過濾器有行健前綴過濾器、子列前綴過濾器、多子列前綴過濾器、列綜合過濾器、結構過濾器。
除了這些常用過濾器外,Hbase還提供其它一些過濾器,比如分頁過濾等,可以在實際使用到的時候靈活選用。

最後更新:2017-11-03 00:03:40

  上一篇:go  將mr寫到Hbase上
  下一篇:go  高德地圖尋人啟事