HBase 过滤器 (一)

HBase 系列(七)——HBase过滤器详解 一、HBase过滤器简介 Hbase提供了种类丰富的过滤器(filter)来提高数据处理的效率,用户可以通过内置或自定义的过滤器来对数据进行过滤,所有的过滤器都在服务端生效,即谓词下推(predicate push down)。这样可以保证过滤掉的数据不会被传送到客户端,从而减轻网络传输和客户端处理的压力。 二、过滤器基础 2.1 Filter接口和FilterBase抽象类 Filter... 阅读详情

HBase 过滤器(filters) 提供了非常强大的功能来帮助用户提高其处理表中数据的效率。用户不仅可以使用 HBase 中预定义好的过滤器,而且可以实现自定义
的过滤器。



1.1 过滤器介绍 (Introduction to Filters)


HBase 中两种主要的读取功能是 Table.get() 和 Table.scan(), 这两种方法或者直接访问数据,或者使用起始和结束键。可以通过给查询逐步添加更多的
限制选择器来限制获取的数据。这包括 column families, column qualifiers, timestamps 或者 ranges, 以及 version numbers.

这些方法可以帮助用户控制哪些数据在查询时被包含其中,但是它们缺少一些细粒度的筛选功能,例如基于正则表达式对行键和值进行筛选。Get 和 Scan 两
个类都支持过滤器基于这样的原因:无法通过提供的 API 功能选择需要的行或列的键,或者值,但可以通过过滤器实现。其基本接口为 Filter, 并且 HBase
提供了一系列具体的类,无需编程就可以直接使用。

另一方面,可以扩展 Filter 类来实现自己的需求。所有过滤器实际上应用到服务器端,也称为谓词下推(predicate pushdown)。这样可以保证被过滤掉的数据
不会被传送到客户端。也可以在客户端代码中实现过滤功能,但会影响系统性能,因为这种情况下,服务器端要传输更多的数据到客户端,应尽量避免这种方式。


    ■ Filter 体系结构 (The Filter Hierarchy)
    -------------------------------------------------------------------------------------------------------------------------------------
    在过滤器的体系结构中,最底层的是 Filter abstract class, 并且 FilterBase 类实现了过滤器的空壳和骨架,这使得实际的过滤器类可以避免许多
    重复的结构代码。
    
    大部分实体过滤器类直接继承自 FilterBase, 也有一些间接继承该类。但它们以同样的方式工作:定义一个要使用过滤器实例,然后把它传入 Get 或
    Scan 实例:
    
        setFilter(filter)

    在初始化过滤器实例时,需要提供一些参数来设定过滤器的用途。其中有一组特殊的过滤器,它们继承自 CompareFilter, 需要提供至少两个特定的参数,
    这两个参数会被基类用于执行它的任务。

    过滤器可以访问它们应用的整个行。这意为着它们可以基于行任何可用的信息来决定该行的命运。这包括 the row key, column qualifiers, column 的
    实际值, timestamps, 等等。


    ■ 比较操作符 (Comparison Operators)
    -------------------------------------------------------------------------------------------------------------------------------------
    因为基于 CompareFilter 的过滤器比基类 FilterBase 多了一个 compare() 操作,它需要使用一个用户提供的操作类型来定义比较操作的结果,其值
    列于下表中:

    The possible comparison operators for CompareFilter-based filters
    +-------------------+-----------------------------------------------------------------------------------
    | Operator            | Description
    +-------------------+------------------------------------------------------------------------------------
    | LESS                | Match values less than the provided one.
    +-------------------+------------------------------------------------------------------------------------
    | LESS_OR_EQUAL        | Match values less than or equal to the provided one.
    +-------------------+------------------------------------------------------------------------------------
    | EQUAL                | Do an exact match on the value and the provided one.
    +-------------------+------------------------------------------------------------------------------------
    | NOT_EQUAL            | Include everything that does not match the provided value.
    +-------------------+------------------------------------------------------------------------------------
    | GREATER_OR_EQUAL    | Match values that are equal to or greater than the provided one.
    +-------------------+------------------------------------------------------------------------------------
    | GREATER            | Only include values greater than the provided one.
    +-------------------+------------------------------------------------------------------------------------
    | NO_OP                | Exclude everything.
    +-------------------+------------------------------------------------------------------------------------
    
    当过滤器被应用时,比较操作符可以决定什么被包含,什么被排除。这可以帮助用户筛选数据的一个范围,一个子集,或一些准确匹配的数据。



    ■ 比较器 (Comparators)
    -------------------------------------------------------------------------------------------------------------------------------------
    第二种需要提供给 CompareFilter 相关类的类型是比较器(comparator), 比较器提供了多种方法来比较不同的键和值。比较器都继承自
    ByteArrayComparable, 它实现了 Java Comparable 接口。如果只想使用 HBase 提供的原生比较器,可以不必过度关注细节,HBase 提供的比较器列于
    下表,这些比较器构造时通常只需要提供一个控制值,这个值将会与 table 中的每个值进行比较。

    The HBase-supplied comparators, used with CompareFilter-based filters
    +---------------------------+-----------------------------------------------------------------------------------------------
    | Comparator                | Description
    +---------------------------+-----------------------------------------------------------------------------------------------
    | LongComparator            | Assumes the given value array is a Java Long number and uses Bytes.toLong() to convert it.
    +---------------------------+-----------------------------------------------------------------------------------------------
    | BinaryComparator            | Uses Bytes.compareTo() to compare the current with the provided value.
    +---------------------------+-----------------------------------------------------------------------------------------------
    | BinaryPrefixComparator    | Similar to the above, but does a left hand, prefix-based match using Bytes.compareTo().
    +---------------------------+-----------------------------------------------------------------------------------------------
    | NullComparator            | Does not compare against an actual value, but checks whether a given one is null, or not null.
    +---------------------------+-----------------------------------------------------------------------------------------------
    | BitComparator                | Performs a bitwise comparison, providing a BitwiseOp enumeration with AND, OR, and XOR operators.
    +---------------------------+-----------------------------------------------------------------------------------------------
    | RegexStringComparator        | Given a regular expression at instantiation, this comparator does a pattern match on the data.
    +---------------------------+-----------------------------------------------------------------------------------------------
    | SubstringComparator        | Treats the value and table data as String instances and performs a contains() check.
    +---------------------------+-----------------------------------------------------------------------------------------------

    
        NOTE:
        ---------------------------------------------------------------------------------------------------------------------------------
        后面的四种比较器 NullComparator, BitComparator, RegexStringComparator, and SubstringComparator, 只能和 EQUAL 和 NOT_EQUAL 操作符
        配合使用,因为这些比较器的 compareTo() 方法在匹配时返回 0,不匹配时返回 1. 把它们应用到 LESS 或 GREATER 上比较,会产生错误的结果。

    通常,每个比较器都有一个带比较值参数的构造器,换句话说,用户需要定义一个值用于与每一个 cell 进行比较。有些构造器需要一个 byte[] 作为
    参数,并通过二进制进行比较,还有一些使用 String 参数进行比较(当需要比较的参数是可读的有序文本时)。


        NOTE:
        ---------------------------------------------------------------------------------------------------------------------------------
        基于字符串的比较器,RegexStringComparator 和 SubstringComparator, 比基于纯字节的比较耗费的成本更高,因为它们首先需要将一个给定的值
        转换为 String, 后续的字符串或正则表达式形式的操作也会增加整个资源耗费成本。




1.2 比较过滤器 (Comparison Filters)
-----------------------------------------------------------------------------------------------------------------------------------------
HBase 提供的第一类过滤器实现是比较过滤器。它们接收比较操作符和比较器实例作为构造器参数。每个比较过滤器都有一个继承自 CompareFilter 的相同
签名的构造器:

    CompareFilter(final CompareOp compareOp, final ByteArrayComparable comparator)

用户需要提供比较操作符和比较器类来让过滤器工作。要记住,HBase 过滤器 API 的通用规范的含义是过滤掉信息,被过滤掉的数据不返回给客户端。过滤
器不是指定要返回的数据,而是在读取数据时不要返回。

但基于 CompareFilter 的所有过滤器所做的正好相反,它们返回匹配的值、换句话说,在选择比较操作符时要小心谨慎,它们从服务器返回数据是不同的。
例如如果需要返回大于或等于某个值的数据,就不应该使用 LESS 来忽略不需要的数据,而应当使用 GREATER_OR_EQUAL 来包含想要的数据。


    ■ 行过滤器 (RowFilter)
    -------------------------------------------------------------------------------------------------------------------------------------
    这个过滤器为用户提供基于行键过滤数据的能力。This filter is used to filter based on the key. It takes an operator (equal, greater, not
    equal, etc) and a byte [] comparator for the row, and column qualifier portions of a key.

    示例:
    
        //Example using a filter to select specific rows
        Scan scan = new Scan();
        scan.addColumn(Bytes.toBytes("colfam1"), Bytes.toBytes("col-1"));
        
        // Create filter, while specifying the comparison operator and comparator. Here an exact match is needed.
        Filter filter1 = new RowFilter(CompareFilter.CompareOp.LESS_OR_EQUAL, new BinaryComparator(Bytes.toBytes("row-22")));
        scan.setFilter(filter1);
        
        ResultScanner scanner1 = table.getScanner(scan);
        for (Result res : scanner1) {
            System.out.println(res);
        }
        scanner1.close();
        
        //Another filter, this time using a regular expression to match the row keys.
        Filter filter2 = new RowFilter(CompareFilter.CompareOp.EQUAL, new RegexStringComparator(".*-.5"));
        scan.setFilter(filter2);
        ResultScanner scanner2 = table.getScanner(scan);
        for (Result res : scanner2) {
            System.out.println(res);
        }
        scanner2.close();
        
        //The third filter uses a substring match approach.
        Filter filter3 = new RowFilter(CompareFilter.CompareOp.EQUAL, new SubstringComparator("-5"));
        scan.setFilter(filter3);
        ResultScanner scanner3 = table.getScanner(scan);
        for (Result res : scanner3) {
            System.out.println(res);
        }
        scanner3.close();

    输出:
        Adding rows to table...
        Scanning table #1...
        keyvalues={row-1/colfam1:col-1/1427273897619/Put/vlen=7/seqid=0}
        keyvalues={row-10/colfam1:col-1/1427273899185/Put/vlen=8/seqid=0}
        keyvalues={row-100/colfam1:col-1/1427273908651/Put/vlen=9/seqid=0}
        keyvalues={row-11/colfam1:col-1/1427273899343/Put/vlen=8/seqid=0}
        keyvalues={row-12/colfam1:col-1/1427273899496/Put/vlen=8/seqid=0}
        keyvalues={row-13/colfam1:col-1/1427273899643/Put/vlen=8/seqid=0}
        keyvalues={row-14/colfam1:col-1/1427273899785/Put/vlen=8/seqid=0}
        keyvalues={row-15/colfam1:col-1/1427273899925/Put/vlen=8/seqid=0}
        keyvalues={row-16/colfam1:col-1/1427273900064/Put/vlen=8/seqid=0}
        keyvalues={row-17/colfam1:col-1/1427273900202/Put/vlen=8/seqid=0}
        keyvalues={row-18/colfam1:col-1/1427273900343/Put/vlen=8/seqid=0}
        keyvalues={row-19/colfam1:col-1/1427273900484/Put/vlen=8/seqid=0}
        keyvalues={row-2/colfam1:col-1/1427273897860/Put/vlen=7/seqid=0}
        keyvalues={row-20/colfam1:col-1/1427273900623/Put/vlen=8/seqid=0}
        keyvalues={row-21/colfam1:col-1/1427273900757/Put/vlen=8/seqid=0}
        keyvalues={row-22/colfam1:col-1/1427273900881/Put/vlen=8/seqid=0}
        Scanning table #2...
        keyvalues={row-15/colfam1:col-1/1427273899925/Put/vlen=8/seqid=0}
        keyvalues={row-25/colfam1:col-1/1427273901253/Put/vlen=8/seqid=0}
        keyvalues={row-35/colfam1:col-1/1427273902480/Put/vlen=8/seqid=0}
        keyvalues={row-45/colfam1:col-1/1427273903582/Put/vlen=8/seqid=0}
        keyvalues={row-55/colfam1:col-1/1427273904633/Put/vlen=8/seqid=0}
        keyvalues={row-65/colfam1:col-1/1427273905577/Put/vlen=8/seqid=0}
        keyvalues={row-75/colfam1:col-1/1427273906453/Put/vlen=8/seqid=0}
        keyvalues={row-85/colfam1:col-1/1427273907327/Put/vlen=8/seqid=0}
        keyvalues={row-95/colfam1:col-1/1427273908211/Put/vlen=8/seqid=0}
        Scanning table #3...
        keyvalues={row-5/colfam1:col-1/1427273898394/Put/vlen=7/seqid=0}
        keyvalues={row-50/colfam1:col-1/1427273904116/Put/vlen=8/seqid=0}
        keyvalues={row-51/colfam1:col-1/1427273904219/Put/vlen=8/seqid=0}
        keyvalues={row-52/colfam1:col-1/1427273904324/Put/vlen=8/seqid=0}
        keyvalues={row-53/colfam1:col-1/1427273904428/Put/vlen=8/seqid=0}
        keyvalues={row-54/colfam1:col-1/1427273904536/Put/vlen=8/seqid=0}
        keyvalues={row-55/colfam1:col-1/1427273904633/Put/vlen=8/seqid=0}
        keyvalues={row-56/colfam1:col-1/1427273904729/Put/vlen=8/seqid=0}
        keyvalues={row-57/colfam1:col-1/1427273904823/Put/vlen=8/seqid=0}
        keyvalues={row-58/colfam1:col-1/1427273904919/Put/vlen=8/seqid=0}
        keyvalues={row-59/colfam1:col-1/1427273905015/Put/vlen=8/seqid=0}


    ■ 列族过滤器 (FamilyFilter)
    -------------------------------------------------------------------------------------------------------------------------------------
    这个过滤器的工作类似于 RowFilter, 但应用比较到一行的列族上,而不是行键上。联合使用可用的比较操作符和比较器,可以在列族级别过滤出获取
    数据中包含的数据。
    
    示例: Example using a filter to include only specific column families
        
        // Create filter, while specifying the comparison operator and comparator
        Filter filter1 = new FamilyFilter(CompareFilter.CompareOp.LESS, new BinaryComparator(Bytes.toBytes("colfam3")));
        
        Scan scan = new Scan();
        scan.setFilter(filter1);
        //Scan over table while applying the filter.
        ResultScanner scanner = table.getScanner(scan);
        for (Result result : scanner) {
            System.out.println(result);
        }
        scanner.close();
        
        Get get1 = new Get(Bytes.toBytes("row-5"));
        get1.setFilter(filter1);
        // Get a row while applying the same filter.
        Result result1 = table.get(get1);
        System.out.println("Result of get(): " + result1);
        
        
        Filter filter2 = new FamilyFilter(CompareFilter.CompareOp.EQUAL, new BinaryComparator(Bytes.toBytes("colfam3")));
        //Create a filter on one column family while trying to retrieve another.
        Get get2 = new Get(Bytes.toBytes("row-5"));
        get2.addFamily(Bytes.toBytes("colfam1"));
        get2.setFilter(filter2);
        //Get the same row while applying the new filter, this will return “NONE”.
        Result result2 = table.get(get2);
        System.out.println("Result of get(): " + result2);

    输出:
        Adding rows to table...
        Scanning table...
        keyvalues={row-1/colfam1:col-1/1427274088598/Put/vlen=7/seqid=0,
        row-1/colfam1:col-2/1427274088615/Put/vlen=7/seqid=0,
        row-1/colfam2:col-1/1427274088598/Put/vlen=7/seqid=0,
        row-1/colfam2:col-2/1427274088615/Put/vlen=7/seqid=0}
        keyvalues={row-10/colfam1:col-1/1427274088673/Put/vlen=8/seqid=0,
        row-10/colfam1:col-2/1427274088675/Put/vlen=8/seqid=0,
        row-10/colfam2:col-1/1427274088673/Put/vlen=8/seqid=0,
        row-10/colfam2:col-2/1427274088675/Put/vlen=8/seqid=0}
        ...
        keyvalues={row-9/colfam1:col-1/1427274088669/Put/vlen=7/seqid=0,
        row-9/colfam1:col-2/1427274088671/Put/vlen=7/seqid=0,
        row-9/colfam2:col-1/1427274088669/Put/vlen=7/seqid=0,
        row-9/colfam2:col-2/1427274088671/Put/vlen=7/seqid=0}
        Result of get(): keyvalues={
        row-5/colfam1:col-1/1427274088652/Put/vlen=7/seqid=0,
        row-5/colfam1:col-2/1427274088654/Put/vlen=7/seqid=0,
        row-5/colfam2:col-1/1427274088652/Put/vlen=7/seqid=0,
        row-5/colfam2:col-2/1427274088654/Put/vlen=7/seqid=0}
        Result of get(): keyvalues=NONE


    ■ 列名过滤器 (QualifierFilter)
    -------------------------------------------------------------------------------------------------------------------------------------
    column qualifier 级别的过滤器,可以从 table 上过滤特定的列:
    
    示例: Example using a filter to include only specific column qualifiers
    
    Filter filter = new QualifierFilter(CompareFilter.CompareOp. LESS_OR_EQUAL, new BinaryComparator(Bytes.toBytes("col-2")));
    Scan scan = new Scan();
    scan.setFilter(filter);
    ResultScanner scanner = table.getScanner(scan);
    for (Result result : scanner) {
        System.out.println(result);
    }
    scanner.close();
    
    Get get = new Get(Bytes.toBytes("row-5"));
    get.setFilter(filter);
    Result result = table.get(get);
    System.out.println("Result of get(): " + result);

    输出:
    Adding rows to table...
    Scanning table...
    keyvalues={row-1/colfam1:col-1/1427274739258/Put/vlen=7/seqid=0,
    row-1/colfam1:col-10/1427274739309/Put/vlen=8/seqid=0,
    row-1/colfam1:col-2/1427274739272/Put/vlen=7/seqid=0,
    row-1/colfam2:col-1/1427274739258/Put/vlen=7/seqid=0,
    row-1/colfam2:col-10/1427274739309/Put/vlen=8/seqid=0,
    row-1/colfam2:col-2/1427274739272/Put/vlen=7/seqid=0}
    ...
    keyvalues={row-9/colfam1:col-1/1427274739441/Put/vlen=7/seqid=0,
    row-9/colfam1:col-10/1427274739458/Put/vlen=8/seqid=0,
    row-9/colfam1:col-2/1427274739443/Put/vlen=7/seqid=0,
    row-9/colfam2:col-1/1427274739441/Put/vlen=7/seqid=0,
    row-9/colfam2:col-10/1427274739458/Put/vlen=8/seqid=0,
    row-9/colfam2:col-2/1427274739443/Put/vlen=7/seqid=0}
    Result of get(): keyvalues={
    row-5/colfam1:col-1/1427274739366/Put/vlen=7/seqid=0,
    row-5/colfam1:col-10/1427274739384/Put/vlen=8/seqid=0,
    row-5/colfam1:col-2/1427274739368/Put/vlen=7/seqid=0,
    row-5/colfam2:col-1/1427274739366/Put/vlen=7/seqid=0,
    row-5/colfam2:col-10/1427274739384/Put/vlen=8/seqid=0,
    row-5/colfam2:col-2/1427274739368/Put/vlen=7/seqid=0}


    ■ 值过滤器 (ValueFilter)
    -------------------------------------------------------------------------------------------------------------------------------------
    这个过滤器可用于筛选某个特定值的的列,配合使用 RegexStringComparator,可以使用功能强大的正则表达式语法来筛选。需要注意的是,某些比较器
    正如之前解释过的那样,只能使用操作符的一个子集,这里使用的子串匹配(substring match) 只能与 EQUAL, 或 NOT_EQUAL 操作符联合使用。
    
    示例: Example using the value based filter
    //Create filter, while specifying the comparison operator and comparator.
    Filter filter = new ValueFilter(CompareFilter.CompareOp.EQUAL,     new SubstringComparator(".4"));
    Scan scan = new Scan();
    //Set filter for the scan.
    scan.setFilter(filter);
    ResultScanner scanner = table.getScanner(scan);
    for (Result result : scanner) {
        for (Cell cell : result.rawCells()) {
        
            //Print out value to check that filter works.
            System.out.println("Cell: " + cell + ", Value: " +
            Bytes.toString(cell.getValueArray(), cell.getValueOffset(),
            cell.getValueLength()));
        }
    }
    scanner.close();
    
    Get get = new Get(Bytes.toBytes("row-5"));
    //Assign same filter to Get instance.
    get.setFilter(filter);
    Result result = table.get(get);
    
    for (Cell cell : result.rawCells()) {
        System.out.println("Cell: " + cell + ", Value: " +
            Bytes.toString(cell.getValueArray(), cell.getValueOffset(),
            cell.getValueLength()));
    }


    输出:
    Adding rows to table...
    Results of scan:
    Cell: row-1/colfam1:col-4/1427275408429/Put/vlen=7/seqid=0, Value: val-1.4
    Cell: row-1/colfam2:col-4/1427275408429/Put/vlen=7/seqid=0, Value: val-1.4
    ...
    Cell: row-9/colfam1:col-4/1427275408605/Put/vlen=7/seqid=0, Value: val-9.4
    Cell: row-9/colfam2:col-4/1427275408605/Put/vlen=7/seqid=0, Value: val-9.4
    Result of get:
    Cell: row-5/colfam1:col-4/1427275408527/Put/vlen=7/seqid=0, Value: val-5.4
    Cell: row-5/colfam2:col-4/1427275408527/Put/vlen=7/seqid=0, Value: val-5.4



    ■ 参考列过滤器 (DependentColumnFilter)
    -------------------------------------------------------------------------------------------------------------------------------------
    这是一种更为复杂的过滤器,不是简单地基于直接的可用信息过滤掉数据,而是要指定一个依赖的列(dependent column),或者说参考列(reference
    column), 来控制如何过滤其它的列。它使用参考列的时间戳,并包含所有其它列中具有与之相同时间戳的数据。构造器如下:
    
        DependentColumnFilter(final byte[] family, final byte[] qualifier)
        DependentColumnFilter(final byte[] family, final byte[] qualifier, final boolean dropDependentColumn)
        DependentColumnFilter(final byte[] family, final byte[] qualifier,     final boolean dropDependentColumn,
                            final CompareOp valueCompareOp, final ByteArrayComparable valueComparator)

    由于这个类时基于 CompareFilter 的,因此它提供了更进深入的列选择,但这个过滤器不是基于列的值过滤的。可以把它理解为一个 ValueFilter 和一个
    参考时间戳过滤器的组合。用户可以可选地传入自己的操作符和比较器对来启用这一特性。该类提供的构造器,可以忽略操作符和比较器,并忽略按值过滤
    的功能,也就是说整个过滤器值基于参考列的时间戳进行筛选。

    dropDependentColumn 参数用于帮助操作参考列:该参数设为 false 或 true 决定了参考列可以被返回还是被丢弃。
    
    示例: Example using a filter to include only specific column families
    
    private static void filter(boolean drop, CompareFilter.CompareOp operator, ByteArrayComparable comparator)     throws IOException {
        
        Filter filter;
        if (comparator != null) {
        
            //Create the filter with various options
            filter = new DependentColumnFilter(Bytes.toBytes("colfam1"), Bytes.toBytes("col-5"), drop, operator, comparator);
        } else {
            filter = new DependentColumnFilter(Bytes.toBytes("colfam1"), Bytes.toBytes("col-5"), drop);
        }
        
        Scan scan = new Scan();
        scan.setFilter(filter);
        // scan.setBatch(4); // cause an error
        ResultScanner scanner = table.getScanner(scan);
        for (Result result : scanner) {
            for (Cell cell : result.rawCells()) {
                System.out.println("Cell: " + cell + ", Value: " +
                Bytes.toString(cell.getValueArray(), cell.getValueOffset(),
                cell.getValueLength()));
            }
        }
        scanner.close();
        
        Get get = new Get(Bytes.toBytes("row-5"));
        get.setFilter(filter);
        Result result = table.get(get);
        for (Cell cell : result.rawCells()) {
            System.out.println("Cell: " + cell + ", Value: " +
            Bytes.toString(cell.getValueArray(), cell.getValueOffset(),
            cell.getValueLength()));
        }
    }
    
    public static void main(String[] args) throws IOException {
    
        //Call filter method with various options.
        filter(true, CompareFilter.CompareOp.NO_OP, null);
        filter(false, CompareFilter.CompareOp.NO_OP, null);
        filter(true, CompareFilter.CompareOp.EQUAL, new BinaryPrefixComparator(Bytes.toBytes("val-5")));
        filter(false, CompareFilter.CompareOp.EQUAL, new BinaryPrefixComparator(Bytes.toBytes("val-5")));
        filter(true, CompareFilter.CompareOp.EQUAL, new RegexStringComparator(".*\\.5"));
        filter(false, CompareFilter.CompareOp.EQUAL, new RegexStringComparator(".*\\.5"));
    }

        NOTE:
        ---------------------------------------------------------------------------------------------------------------------------------
        这种过滤器与扫描操作的批量处理功能不兼容,也就是 Scan.setBatch() 设置一个大于 0 的值。这个过滤器需要看到整行的数据才能工作,使用
        批处理可能导致取到的数据不包括参考列时间戳,会导致错误的结果。

    这个例子不同于之前提到的过滤器,因为它控制列的版本来得到时间戳相符的结果。服务器端使用隐式的时间戳作为版本可能导致结果出现波动,主要
    原因是用户不能保证使用的时间戳精确到毫秒。
    
    filter() 方法使用不同的参数组合调用,展示了内置的值过滤器和 drop 标志对返回数据集的影响。
    
    输出:
        Adding rows to table...
        Results of scan:
        Cell: row-1/colfam2:col-5/5/Put/vlen=7/seqid=0, Value: val-1.5
        Cell: row-10/colfam2:col-5/5/Put/vlen=8/seqid=0, Value: val-10.5
        ...
        Cell: row-8/colfam2:col-5/5/Put/vlen=7/seqid=0, Value: val-8.5
        Cell: row-9/colfam2:col-5/5/Put/vlen=7/seqid=0, Value: val-9.5
        Result of get:
        Cell: row-5/colfam2:col-5/5/Put/vlen=7/seqid=0, Value: val-5.5
        Results of scan:
        Cell: row-1/colfam1:col-5/5/Put/vlen=7/seqid=0, Value: val-1.5
        Cell: row-1/colfam2:col-5/5/Put/vlen=7/seqid=0, Value: val-1.5
        Cell: row-9/colfam1:col-5/5/Put/vlen=7/seqid=0, Value: val-9.5
        Cell: row-9/colfam2:col-5/5/Put/vlen=7/seqid=0, Value: val-9.5
        Result of get:
        Cell: row-5/colfam1:col-5/5/Put/vlen=7/seqid=0, Value: val-5.5
        Cell: row-5/colfam2:col-5/5/Put/vlen=7/seqid=0, Value: val-5.5

    设置 dropDependentColumn 为 true 或 false 得到两种不同的结果。第一个 scan 和 get 输出 colfam1 列被忽略,第二部分的输出它是包含的。
    
    What is this filter good for you might wonder? It is used where applications require client-side timestamps (these could be epoch
    based, or based on some internal global counter) to track dependent updates. Say you insert some kind of transactional data, where
    across the row all fields that are updated, should form some dependent update. In this case the client could set all columns that
    are updated in one mutation to the same timestamp, and when later wanting to show the entity at a certain point in time, get(or scan)
    the row at that time. All modifications from earlier (or later, or exact) changes are then masked out (or included). See for libraries
    on top of HBase that make use of such as schema.
 

 

参考:

HBase 过滤器 (二)

 

 

HBase过滤器查询 目录 1、过滤器 2、比较过滤器使用 3、专用过滤器使用 4、多过滤器综合查询FilterList 1、过滤器 过滤器的作用是在服务端判断数据是否满足条件,然后只将满足条件的数据返回给客户端 过滤器的类型很多,但是可以分为两大类 比较过滤器 专用过滤器 2、比较过滤器使用 HBase过滤器的比较运算符: LESS < LESS_OR_EQUAL <= EQUAL = NOT_EQUAL <> GREATER_OR_EQUAL >= 阅读详情

相关推荐

HBase高级特性:过滤器(一)

第1关:使用过滤器查询指定行的数据 本关任务:使用过滤器筛选数据 package step1; import java.io.IOException; import org.apache.hadoop.cli.util.*; import org.apache.hadoop.conf.*; import org.apache.hadoop.hbase.*; import org.apache.hadoop.hbase.client.*; import org.apache.hadoop.hbase.filt

Junds0的博客 4859

大数据从入门到实战 - HBase高级特性:过滤器(一)

大数据从入门到实战 - HBase高级特性:过滤器(一) 一、关于此次实践 1、实战简介 2、全部任务 二、实践详解 1、第 1关:使用过滤器查询指定行的数据 2、第 2关:使用正则表达式与子字符串匹配行键 3、第 3关:列族过滤器、值过滤器、列名过滤器 叮嘟!这里是小啊呜的学习课程资料整理。好记性不如烂笔头,今天也是努力进步的一天。一起加油进阶吧!

小啊呜的博客 1万+

HBase高级特性之过滤器:提升数据检索与处理效率

通过以上示例,我们可以看到HBase的过滤器机制为数据的查询和处理提供了灵活、高效的方式。通过合理使用过滤器,我们可以实现更精确的数据检索,并且减少不必要的数据传输和计算开销。因此,在实际应用中,根据具体场景和需求,合理选择和配置过滤器是优化HBase性能的重要手段之一。过滤器是HBase中一种用于检索和处理数据的机制,它可以在数据读取和写入时对数据进行过滤和加工,以达到快速定位所需数据的目的。以上代码使用了HBase的过滤器功能,创建了两个列值过滤器,并通过设置过滤器列表将两个过滤器进行逻辑或操作。

PixelDude的博客 445

【十八掌●武功篇】第八掌:HBase之过滤器总结

二十二、 比较过滤器

鸣宇淳的专栏 940

国产麒麟系统下Kettle安装避坑指南:解决aarch64架构不支持问题

本文详细解析了在国产麒麟系统上部署Kettle时遇到的aarch64架构不支持问题,提供了从获取适配的SWT库、修改启动脚本到生产环境调优的完整解决方案。文章重点解决了ARM架构与Java GUI工具的兼容性挑战,并分享了内存配置、字体显示及Carte服务部署等实战经验,助力用户在国产化环境中稳定运行ETL流程。

weixin_29197835的博客 562

Windows10完美驱动Apple Studio Display:从雷电接口到亮度调节全攻略

本文详细介绍了如何在Windows10系统上完美驱动Apple Studio Display,涵盖雷电接口兼容性、亮度调节及色彩管理等关键问题。通过实测对比不同转接方案和显卡兼容性,推荐使用贝尔金VR线和NVIDIA GTX-1660显卡,并提供了BootCamp驱动安装和亮度调节的终极解决方案,帮助用户实现最佳显示效果。

elastic6hunter的博客 1122

Hbase过滤器(一)

首先解释一个名词:谓词下推: 所有的过滤器都会在服务端生效,保证过滤掉的数据不会被传送到客户端 1.过滤器的层次结构;最底层是filter接口和filterBase抽象类,都是直接或间接实现接口或继承抽象类 2.比较运算符:继承compareFilter的过滤器比filterBase多了一个compare方法,所以需要使用传入的参数定义比较操作的过程 3.比较器:comparator,比较器

anlu的博客 802

上、下拉电阻(定义、强弱上拉、常见作用、吸电流、拉电流、灌电流)

1.上、下拉电阻定义 上拉电阻是把一个信号通过一个电阻接到电源(Vcc),下拉电阻是一个信号通过一个电阻接到地(GND)。 2.强上拉、弱上拉 强上拉、弱上拉的强弱只是上拉电阻的阻值不同,没有什么严格区分。例如:50Ω上拉,一般成为强上拉;100kΩ上拉则称为弱上拉。下拉也是一样的。强拉电阻的极端就是0Ω电阻,即将信号线直接与电源或低相连接。 3.上、下拉电阻的作用 因为上下拉电阻的作用概念很宽泛,不用领域的使用方法也不同,常见使用方法整理如下: ...

小浪宝宝的博客 3万+

头歌 HBase高级特性:过滤器(一)

头歌 HBase高级特性:过滤器(一) 摘要:本文介绍了HBase高级特性中三种过滤器使用方法及答案。第1关实现行键条件查询,包括等于、大于和小于等于条件的RowFilter使用;第2关展示正则表达式(RegexStringComparator)和子字符串匹配(SubstringComparator)的行键查询;第3关演示列族过滤器(FamilyFilter)、列名过滤器(QualifierFilter)和值过滤器(ValueFilter)的应用。

一名敲代码的苦13程序员 863

大规模SoC芯片Hierarchical Flow Calibre LVS教程

大规模SoC芯片Hierarchical Flow Calibre物理验证LVS实现教程

weixin_37584728的博客 1200

【踩坑记录】colmap中的相机位姿的坐标系定义及其可视化结果的隐含转换

1 坐标系定义及转换   首先介绍一下世界坐标系和相机坐标系之间的转换,它们之间是存在一个转换关系的。现假设空间中一点X,它在相机坐标系下的坐标是Xcamera,在世界坐标系下的坐标是Xworld。假设它通过R和t实现从相机坐标系到世界坐标系之间的转换: Xworld = RXcamera + t   那么,由上式,我们可以推得从世界坐标系向相机坐标系的转换关系(RT=R-1,所以通常直接使用RT即可): Xcamera = RTXworld - RTt   所以,两个坐标系之间的转换,需要看其具体

zeeq的博客 2万+

布隆过滤器原理+hbase应用场景(一看就明白)

目录布隆过滤器HBase中如何设置 布隆过滤器 布隆是个人,发明了布隆算法,基于布隆算法实现的组件,称为布隆过滤器!这个组件一般是用作过滤! 过滤功能: 在海量数据中,用非常高的效率和性能,判断一个数据是否在集合中存在! 作用: 布隆过滤器只能判断一个数据要么一定在集合中不存在,要么在集合中可能存在! 误判: 布隆过滤器判断数据可能存在,实际扫描后,发现不存在,这种情况有存在的几率! 布隆过滤器是可以提升读的性能!存在误判率! 那么我就画一个图来解释一下 说明R3在集合中一定不存在 说明R4可能存

Knight 1467

核心组件大换血:Backbone与Neck魔改篇:YOLO26结合StarNet结构:2026星状网络在YOLO生态的即插即用实战

本文将介绍如何将StarNet作为Backbone替换YOLO26原生架构,以提升边缘设备上的目标检测性能。文章首先分析了YOLO26在特定场景下的精度瓶颈,指出其通用Backbone设计存在不足。随后深入解析StarNet的核心创新——星操作(Star Operation),这一低维计算却能获得高维特征表达的数学魔术,以及其极简的StarBlock模块设计。通过对比YOLO26原生架构的三大创新与痛点,作者提出两种替换策略:完整替换Backbone或局部替换+Neck联调。文中提供了StarNet核心代码

ZDQ58818的博客 290

大数据从入门到实战——HBase高级特性:过滤器(一)

HBase高级特性:过滤器(一)使用过滤器查询指定行的数据使用正则表达式与子字符串匹配行键列族过滤器、值过滤器、列名过滤器 使用过滤器查询指定行的数据 package step1; import java.io.IOException; import org.apache.hadoop.cli.util.*; import org.apache.hadoop.conf.*; import org.apache.hadoop.hbase.*; import org.apache.hadoop.hbase.

Littlerainlv的博客 6411

GEE生物量预测:利用多源遥感数据和随机森林算法RF构建地上生物量(AGB)预测模型,并实现未来年份的生态变化模拟(大面积生物量反演)

数据融合策略:整合5类遥感产品(AGB、NDVI、LAI、土地覆盖、地形)时序特征构建:采用生长季中值法降低云污染影响机器学习优化分层采样保证数据代表性80棵决策树平衡精度与效率预测可靠性基准期R²达0.76需结合地面实测数据校正。

此星光明博客 419

SWC_RTE01-AutoSAR架构【AutoSAR架构设计概述】

1 基于AutoSAR架构的概述 1.1架构层面:功能可以细分子功能,各个子功能需要交互。 -大功能可以通过Autosar组件Composition去表示; -各个子功能一般具有不可分割性,可以通过Autosar原子组件Component去表示; -各个子功能的交互可以通过接口去通信和交互; -各个子功能的行为可以通过内部行为去表示;具体表现为Runnable的设计;架构设计的时候不考虑具体的逻辑实现;只会关注Ruannble的触发事件或周期;数据访问的一致性问题;具体逻辑设计可通过模版c文件实现或通过基于

8453

Hbase 过滤器

从菜鸟到菜菜鸟 559

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

Hbase过滤器

cxy_19891109的博客 154

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

HBase简介

一、Hadoop的局限 HBase 是一个构建在 Hadoop 文件系统之上的面向列的数据库管理系统。 要想明白为什么产生 HBase,就需要先了解一下 Hadoop 存在的限制?Hadoop 可以通过 HDFS 来存储结构化、半结构甚至非结构化的数据,它是传统数据库的补充,是海量数据存储的最佳方法,它针对大文件的存储,批量访问和流式访问都做了优化,同时也通过多副本解决了容灾问题。 但是 Hadoop 的缺陷在于它只能执行批处理,并且只能以顺序方式访问数据,这意味着即使是最简单的工作,也必须.

m0_55834564的博客 306

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

hbase的过滤器

hbase的过滤器 1.概述 hbase的API中可以进行查询,但是这种查询一般只能单行或者是指定行键的范围的查询,在正常需要精细查询的场合有诸多的不便,所以系统内置了很多的过滤器 2.过滤器汇总 过滤器分为两大类:比较过滤器和专用过滤器 3.比较过滤器 行键过滤器 RowFilter Filter filter1 = new RowFilter(CompareOp.LESS_OR_EQUAL...

大数据容器 4571

Hbase 过滤器的使用

Filter filter= new RowFilter(CompareFilter.CompareOp.EQUAL,new RegexStringComparator("."+day));//任意以day结尾的row Filter filter= new RowFilter(CompareFilter.CompareOp.EQUAL, n...

weixin_30846599的博客 202

Hbase 过滤器详解

Hbase 过滤器详解

mxk4869的博客 4499

HBase过滤器

文章目录过滤器列名过滤器列名前缀过滤器列簇过滤器Row Key过滤器Row Key前缀过滤器值过滤器过滤器组合比较符号比较方式常用过滤器示例另一些测试示例 过滤器 我们我们来看几个常用的过滤器: 过滤器 说明 RowFilter 筛选指定的RowKey FilterList 组合其他过滤器 ValueFilter 筛选指定值的数据 PrefixFilter 筛选有指定前缀的RowKey QualifierFilter 筛选指定列名的列 ColumnPrefixFilter

trayvontang的博客 2230

HBase 过滤器

HBase过滤器、比较器

hujieliang123的博客 4149
上一篇: HBase CRUD 操作指南 (三)
下一篇: HBase 过滤器 (二)
devalone
博客等级 码龄17年 108粉丝 80原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值