hbase过滤器

本文详细介绍了HBase中各类过滤器的功能与用法,包括比较过滤器和专用过滤器两大类,具体涉及RowFilter、FamilyFilter、QualifierFilter、ValueFilter等,并提供了丰富的代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这篇文章来自hbase权威指南阅读随手笔记二之过滤器

base过滤器的比较操作符:

LESS  <
LESS_OR_EQUAL <=
EQUAL =
NOT_EQUAL <>
GREATER_OR_EQUAL >=
GREATER >
NO_OP no operation

比较器:

BinaryComparator  按字节索引顺序比较指定字节数组,采用Bytes.compareTo(byte[])
BinaryPrefixComparator 跟前面相同,只是比较左端的数据是否相同
NullComparator 判断给定的是否为空
BitComparator 按位比较 a BitwiseOp class 做异或,与,并操作
RegexStringComparator 提供一个正则的比较器,仅支持 EQUAL 和非EQUAL
SubstringComparator 判断提供的子串是否出现在table的value中。

Hbase的过滤器分类

比较过滤器

1、Comparision Filters
   1.1 RowFilter
  构造函数

public RowFilter(org.apache.hadoop.hbase.filter.CompareFilter.CompareOp rowCompareOp, org.apache.hadoop.hbase.filter.WritableByteArrayComparable rowComparator) {}

  选择比较rowkey来确定选择合适的行信息

public class RowFilterExample {

  public static void main(String[] args) throws IOException {
    Configuration conf = HBaseConfiguration.create();

    HBaseHelper helper = HBaseHelper.getHelper(conf);
    helper.dropTable("testtable");
    helper.createTable("testtable", "colfam1", "colfam2");
    System.out.println("Adding rows to table...");
    helper.fillTable("testtable", 1, 100, 100, "colfam1", "colfam2");

    HTable table = new HTable(conf, "testtable");

    // vv RowFilterExample
    Scan scan = new Scan();
    scan.addColumn(Bytes.toBytes("colfam1"), Bytes.toBytes("col-0"));

    Filter filter1 = new RowFilter(CompareFilter.CompareOp.LESS_OR_EQUAL, // co RowFilterExample-1-Filter1 Create filter, while specifying the comparison operator and comparator. Here an exact match is needed.
      new BinaryComparator(Bytes.toBytes("row-22")));
    scan.setFilter(filter1);
    ResultScanner scanner1 = table.getScanner(scan);
    // ^^ RowFilterExample
    System.out.println("Scanning table #1...");
    // vv RowFilterExample
    for (Result res : scanner1) {
      System.out.println(res);
    }
    scanner1.close();

    Filter filter2 = new RowFilter(CompareFilter.CompareOp.EQUAL, // co RowFilterExample-2-Filter2 Another filter, this time using a regular expression to match the row keys.
      new RegexStringComparator(".*-.5"));
    scan.setFilter(filter2);
    ResultScanner scanner2 = table.getScanner(scan);
    // ^^ RowFilterExample
    System.out.println("Scanning table #2...");
    // vv RowFilterExample
    for (Result res : scanner2) {
      System.out.println(res);
    }
    scanner2.close();

    Filter filter3 = new RowFilter(CompareFilter.CompareOp.EQUAL, // co RowFilterExample-3-Filter3 The third filter uses a substring match approach.
      new SubstringComparator("-5"));
    scan.setFilter(filter3);
    ResultScanner scanner3 = table.getScanner(scan);
    // ^^ RowFilterExample
    System.out.println("Scanning table #3...");
    // vv RowFilterExample
    for (Result res : scanner3) {
      System.out.println(res);
    }
    scanner3.close();
    // ^^ RowFilterExample
  }
}

1.2 FamilyFilter
  构造函数

public FamilyFilter(CompareOp familyCompareOp, WritableByteArrayComparable familyComparator) {}

  通过和列簇比较得到,返回结果为真的数据,示例:

public class FamilyFilterExample {

  public static void main(String[] args) throws IOException {
    Configuration conf = HBaseConfiguration.create();

    HBaseHelper helper = HBaseHelper.getHelper(conf);
    helper.dropTable("testtable");
    helper.createTable("testtable", "colfam1", "colfam2", "colfam3", "colfam4");
    System.out.println("Adding rows to table...");
    helper.fillTable("testtable", 1, 10, 2, "colfam1", "colfam2", "colfam3", "colfam4");

    HTable table = new HTable(conf, "testtable");

    // vv FamilyFilterExample
    Filter filter1 = new FamilyFilter(CompareFilter.CompareOp.LESS, // co FamilyFilterExample-1-Filter Create filter, while specifying the comparison operator and comparator.
      new BinaryComparator(Bytes.toBytes("colfam3")));

    Scan scan = new Scan();
    scan.setFilter(filter1);
    ResultScanner scanner = table.getScanner(scan); // co FamilyFilterExample-2-Scan Scan over table while applying the filter.
    // ^^ FamilyFilterExample
    System.out.println("Scanning table... ");
    // vv FamilyFilterExample
    for (Result result : scanner) {
      System.out.println(result);
    }
    scanner.close();

    Get get1 = new Get(Bytes.toBytes("row-5"));
    get1.setFilter(filter1);
    Result result1 = table.get(get1); // co FamilyFilterExample-3-Get Get a row while applying the same filter.
    System.out.println("Result of get(): " + result1);

    Filter filter2 = new FamilyFilter(CompareFilter.CompareOp.EQUAL,
      new BinaryComparator(Bytes.toBytes("colfam3")));
    Get get2 = new Get(Bytes.toBytes("row-5")); // co FamilyFilterExample-4-Mismatch Create a filter on one column family while trying to retrieve another.
    get2.addFamily(Bytes.toBytes("colfam1"));
    get2.setFilter(filter2);
    Result result2 = table.get(get2); // co FamilyFilterExample-5-Get2 Get the same row while applying the new filter, this will return "NONE".
    System.out.println("Result of get(): " + result2);
    // ^^ FamilyFilterExample
  }
}

1.3 QualifierFilter
  构造函数

public QualifierFilter(CompareOp qualifierCompareOp, WritableByteArrayComparable qualifierComparator) {}

通过和列名比较,返回为真的数据,示例:

 // vv QualifierFilterExample
    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);
    // ^^ QualifierFilterExample
    System.out.println("Scanning table... ");
    // vv QualifierFilterExample
    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);

1.4 ValueFilter
  构造函数

public ValueFilter(CompareOp valueCompareOp, WritableByteArrayComparable valueComparator) {}
 Filter filter = new ValueFilter(CompareFilter.CompareOp.EQUAL, // co ValueFilterExample-1-Filter Create filter, while specifying the comparison operator and comparator.
      new SubstringComparator(".4") );

    Scan scan = new Scan();
    scan.setFilter(filter); // co ValueFilterExample-2-SetFilter Set filter for the scan.
    ResultScanner scanner = table.getScanner(scan);
    // ^^ ValueFilterExample
    System.out.println("Results of scan:");
    // vv ValueFilterExample
    for (Result result : scanner) {
      for (KeyValue kv : result.raw()) {
        System.out.println("KV: " + kv + ", Value: " + // co ValueFilterExample-3-Print1 Print out value to check that filter works.
          Bytes.toString(kv.getValue()));
      }
    }
    scanner.close();

    Get get = new Get(Bytes.toBytes("row-5"));
    get.setFilter(filter); // co ValueFilterExample-4-SetFilter2 Assign same filter to Get instance.
    Result result = table.get(get);
    // ^^ ValueFilterExample
    System.out.println("Result of get: ");
    // vv ValueFilterExample
    for (KeyValue kv : result.raw()) {
      System.out.println("KV: " + kv + ", Value: " +
        Bytes.toString(kv.getValue()));
    }

1.5 DependentColumnFilter
  该过滤器有两个参数 —— 列族和列修饰。 尝试找到该列所在的每一行,并返回该行具有相同时间戳的全部键值对。如果某一行不包含指定的列,则该行的任何键值对都不返回。
  该过滤器还可以有一个可选布尔参数 —— dropDependentColumn. 如果为true, 从属的列不返回。
  该过滤器还可以有两个可选参数 —— 一个比较操作符和一个值比较器,用于列族和修饰的进一步检查。如果从属的列找到,其值还必须通过值检查,然后就是时间戳必须考虑.

package filters;

// cc DependentColumnFilterExample Example using a filter to include only specific column families
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.HBaseConfiguration;
import org.apache.hadoop.hbase.KeyValue;
import org.apache.hadoop.hbase.client.Get;
import org.apache.hadoop.hbase.client.HTable;
import org.apache.hadoop.hbase.client.Result;
import org.apache.hadoop.hbase.client.ResultScanner;
import org.apache.hadoop.hbase.client.Scan;
import org.apache.hadoop.hbase.filter.BinaryPrefixComparator;
import org.apache.hadoop.hbase.filter.CompareFilter;
import org.apache.hadoop.hbase.filter.DependentColumnFilter;
import org.apache.hadoop.hbase.filter.Filter;
import org.apache.hadoop.hbase.filter.RegexStringComparator;
import org.apache.hadoop.hbase.filter.WritableByteArrayComparable;
import org.apache.hadoop.hbase.util.Bytes;
import util.HBaseHelper;

import java.io.IOException;

public class DependentColumnFilterExample {

  private static HTable table = null;

  // vv DependentColumnFilterExample
  private static void filter(boolean drop,
      CompareFilter.CompareOp operator,
      WritableByteArrayComparable comparator)
  throws IOException {
    Filter filter;
    if (comparator != null) {
      filter = new DependentColumnFilter(Bytes.toBytes("colfam1"), // co DependentColumnFilterExample-1-CreateFilter Create the filter with various options.
        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);
    ResultScanner scanner = table.getScanner(scan);
    // ^^ DependentColumnFilterExample
    System.out.println("Results of scan:");
    // vv DependentColumnFilterExample
    for (Result result : scanner) {
      for (KeyValue kv : result.raw()) {
        System.out.println("KV: " + kv + ", Value: " +
          Bytes.toString(kv.getValue()));
      }
    }
    scanner.close();

    Get get = new Get(Bytes.toBytes("row-5"));
    get.setFilter(filter);
    Result result = table.get(get);
    // ^^ DependentColumnFilterExample
    System.out.println("Result of get: ");
    // vv DependentColumnFilterExample
    for (KeyValue kv : result.raw()) {
      System.out.println("KV: " + kv + ", Value: " +
        Bytes.toString(kv.getValue()));
    }
    // ^^ DependentColumnFilterExample
    System.out.println("");
    // vv DependentColumnFilterExample
  }

  public static void main(String[] args) throws IOException {
    // ^^ DependentColumnFilterExample
    Configuration conf = HBaseConfiguration.create();

    HBaseHelper helper = HBaseHelper.getHelper(conf);
    helper.dropTable("testtable");
    helper.createTable("testtable", "colfam1", "colfam2");
    System.out.println("Adding rows to table...");
    helper.fillTable("testtable", 1, 10, 10, true, "colfam1", "colfam2");

    table = new HTable(conf, "testtable");

    // vv DependentColumnFilterExample
    filter(true, CompareFilter.CompareOp.NO_OP, null);
    filter(false, CompareFilter.CompareOp.NO_OP, null); // co DependentColumnFilterExample-2-Filter Call filter method with various options.
    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"));
  }
  // ^^ DependentColumnFilterExample}

2、Dedicated Filters
  2.1 SingleColumnValueFilter
  选定列簇和某一列,然后与列的value相比,正确的返回全部的row,注意如果某一行不含有该列,同样返回,除非通过filterIfColumnMissing 设置成真。
  构造函数

SingleColumnValueFilter(byte[] family, byte[] qualifier, CompareOp compareOp, WritableByteArrayComparable comparator)

该过滤器通过下面两个参数 filterIfMissing,latestVersionOnly

boolean getFilterIfMissing()
void setFilterIfMissing(boolean filterIfMissing)
boolean getLatestVersionOnly()
void setLatestVersionOnly(boolean latestVersionOnly)

如果 filterIfColumnMissing 标志设为真,如果该行没有指定的列,那么该行的所有列将不发出。缺省值为假。
如果setLatestVersionOnly 标志设为假,将检查此前的版本。缺省值为真。实例如下:

  // vv SingleColumnValueFilterExample
    SingleColumnValueFilter filter = new SingleColumnValueFilter(
      Bytes.toBytes("colfam1"),
      Bytes.toBytes("col-5"),
      CompareFilter.CompareOp.NOT_EQUAL,
      new SubstringComparator("val-5"));
    filter.setFilterIfMissing(true);

    Scan scan = new Scan();
    scan.setFilter(filter);
    ResultScanner scanner = table.getScanner(scan);
    // ^^ SingleColumnValueFilterExample
    System.out.println("Results of scan:");
    // vv SingleColumnValueFilterExample
    for (Result result : scanner) {
      for (KeyValue kv : result.raw()) {
        System.out.println("KV: " + kv + ", Value: " +
          Bytes.toString(kv.getValue()));
      }
    }
    scanner.close();

    Get get = new Get(Bytes.toBytes("row-6"));
    get.setFilter(filter);
    Result result = table.get(get);
    System.out.println("Result of get: ");
    for (KeyValue kv : result.raw()) {
      System.out.println("KV: " + kv + ", Value: " +
        Bytes.toString(kv.getValue()));
    }

2.2 SingleColumnValueExcludeFilter
该过滤器同上面的过滤器正好相反,如果条件相符,将不会返回该列的内容。
2.3 PrefixFilter
所有的row的实例匹配prefix的时候返回结果集合

Filter filter = new PrefixFilter(Bytes.toBytes("row1"));
Scan scan = new Scan();
scan.setFilter(filter);
ResultScanner scanner = table.getScanner(scan);


for(Result result: scanner){
    for(KeyValue kv: result.raw()) {
        System.out.println("KV:" + kv + ", Value:"  + Bytes.toString(kv.getValue()));
    }
}
scanner.close();

Get get = new Get(Bytes.toBytes("row-5"));
get.setFilter(filter);
Result result = table.get(get);
for(KeyValue kv : result.raw()){
    System.out.println("KV:" + kv + ", Value:"  + Bytes.toString(kv.getValue()));
}

2.4 PageFilter
页过滤,通过设置pagesize参数可以返回每一页page的数量。
客户端需要记住上一次访问的row的key值。

package hbaseTest;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.HBaseConfiguration;
import org.apache.hadoop.hbase.client.HTable;
import org.apache.hadoop.hbase.client.Result;
import org.apache.hadoop.hbase.client.ResultScanner;
import org.apache.hadoop.hbase.client.Scan;
import org.apache.hadoop.hbase.filter.Filter;
import org.apache.hadoop.hbase.filter.PageFilter;
import org.apache.hadoop.hbase.util.Bytes;

import java.io.IOException;

/**
 * Hello world!
 */
public class PageFilterExample {
    public static void main(String[] args) throws IOException {
        Configuration config = HBaseConfiguration.create();
        config.set("hbase.zookeeper.quorum", "QT-H-0038");

        String tableName = "testTable";
        String cfName = "colfam1";
        final byte[] POSTFIX = new byte[] { 0x00 };
        HTable table = new HTable(config, tableName);
        Filter filter = new PageFilter(15);
        byte[] lastRow = null;
        int totalRows = 0;
        while (true) {
            Scan scan = new Scan();
            scan.setFilter(filter);
            if(lastRow != null){
                //注意这里添加了POSTFIX操作,不然死循环了
                byte[] startRow = Bytes.add(lastRow,POSTFIX);
                scan.setStartRow(startRow);
            }
            ResultScanner scanner = table.getScanner(scan);
            int localRows = 0;
            Result result;
            while((result = scanner.next()) != null){
                System.out.println(localRows++ + ":" + result);
                totalRows ++;
                lastRow = result.getRow();
            }
            scanner.close();
            if(localRows == 0) break;
        }
        System.out.println("total rows:" + totalRows);
    }

}

因为hbase的row是字典序列排列的,因此上一次的lastrow需要添加额外的0表示新的开始。另外startKey的那一行是包含在scan里面的。

 2.5 KeyOnlyFilter

因为一些应用只想获取data数据,而不是真实的val,可以使用这个过滤器。该过滤器通过

KeyOnlyFilter(boolean lenAsVal)  

lenAsVal默认为假,表示不把val的长度作为val。否则 val的长度将作为val输出。

        final byte[] POSTFIX = new byte[] { 0x00 };
        HTable table = new HTable(config, tableName);
        Filter filter = new KeyOnlyFilter(false);
        byte[] lastRow = null;
        int totalRows = 0;


        Scan scan = new Scan();
        scan.setFilter(filter);
        ResultScanner scanner = table.getScanner(scan);
        for(Result result: scanner){
            for(KeyValue kv: result.raw()){
                System.out.println(kv + ":" + Bytes.toString(kv.getValue()));
            }
        }

2.6 FirstKeyOnlyFilter
在对hbase的表进行扫描的时候,如果指定了FirstKeyOnlyFilter过滤条件则仅仅会返回相同key的第一条kv。
当对hbase中的表进行count,sum操作等集合操作的时候,使用FirstKeyOnlyFilter会带来性能上的提升。

public class KeyOnlyFilterExample {
    public static void main(String[] args) throws IOException {
        Configuration config = HBaseConfiguration.create();
        config.set("hbase.zookeeper.quorum", "QT-H-0038");

        String tableName = "testTable";
        String cfName = "colfam1";
        final byte[] POSTFIX = new byte[] { 0x00 };
        HTable table = new HTable(config, tableName);
        Filter filter = new FirstKeyOnlyFilter();
        byte[] lastRow = null;
        int totalRows = 0;

        Scan scan = new Scan();
        scan.setFilter(filter);
        ResultScanner scanner = table.getScanner(scan);
        for(Result result: scanner){
            for(KeyValue kv: result.raw()){
                System.out.println(kv + ":" + Bytes.toString(kv.getValue()));
            }
        }
    }
}

返回的结果是

row-5/colfam1:qual1/1354673733503/Put/vlen=4:row1
row1/colfam1:qual1/1354432930568/Put/vlen=4:val1
row2/colfam1:qual2/1354432930568/Put/vlen=4:val3

如果注释掉过滤器的返回的结果是:

row-5/colfam1:qual1/1354673733503/Put/vlen=4:row1
row1/colfam1:qual1/1354432930568/Put/vlen=4:val1
row1/colfam1:qual2/1354435819120/Put/vlen=4:val2
row2/colfam1:qual2/1354432930568/Put/vlen=4:val3

2.7 InclusiveStopFilter
  因为hbase的scan包含start-row不包含stop-row 如果使用这个过滤器我们可以包含stop-row

        HTable table = new HTable(config, tableName);

        Filter filter  = new InclusiveStopFilter(Bytes.toBytes("row1"));

        Scan scan = new Scan();
        scan.setFilter(filter);
        scan.setStartRow(Bytes.toBytes("row-5"));
        ResultScanner scanner = table.getScanner(scan);

        for(Result result: scanner){
            System.out.println(result);
        }

会看到row1包含在结果中了。

2.8 TimestampsFilter
当访问某个Timestamp的新闻的时候,我们需要如下的代码:

TimestampsFilter(List<Long> timestamps)  

接受的参数的list参数,该Filter也可以和scan.setTimeRange混合使用。例如:

// vv TimestampFilterExample
    List<Long> ts = new ArrayList<Long>();
    ts.add(new Long(5));
    ts.add(new Long(10)); // co TimestampFilterExample-1-AddTS Add timestamps to the list.
    ts.add(new Long(15));
    Filter filter = new TimestampsFilter(ts);

    Scan scan1 = new Scan();
    scan1.setFilter(filter); // co TimestampFilterExample-2-AddFilter Add the filter to an otherwise default Scan instance.
    ResultScanner scanner1 = table.getScanner(scan1);
    // ^^ TimestampFilterExample
    System.out.println("Results of scan #1:");
    // vv TimestampFilterExample
    for (Result result : scanner1) {
      System.out.println(result);
    }
    scanner1.close();

    Scan scan2 = new Scan();
    scan2.setFilter(filter);
    scan2.setTimeRange(8, 12); // co TimestampFilterExample-3-AddTSRange Also add a time range to verify how it affects the filter
    ResultScanner scanner2 = table.getScanner(scan2);
    // ^^ TimestampFilterExample
    System.out.println("Results of scan #2:");
    // vv TimestampFilterExample
    for (Result result : scanner2) {
      System.out.println(result);
    }
    scanner2.close();

2.12 RandomRowFilter
随即的返回row的数据,构造函数为

RandomRowFilter(float chance)

chance取值为0到1.0,如果<0则为空,如果>1则包含所有的行。

<think>嗯,用户想了解HBase过滤器的使用方法和操作示例。首先,我需要回忆HBase过滤器的基本知识。记得HBase过滤器主要是在数据查询时用来筛选结果,类似于SQL中的WHERE子句。根据之前的引用内容,用户提到了FilterList、FamilyFilter、RowFilter等,可能还需要介绍其他常用的过滤器类型。 用户的问题主要集中在使用方法和示例,所以需要分步骤说明。首先可能需要介绍如何创建过滤器,然后如何组合使用,最后给出代码示例。需要注意的是,用户提供的引用中有提到FilterList支持AND和OR操作,这点很重要,应该详细说明。 另外,用户引用的资料里提到了HBase Filter Language,可能需要解释一下这种语言的配置方式。比如比较操作符如EQUAL、GREATER等,以及如何结合不同的比较器,如BinaryComparator和RegexStringComparator。 还要注意代码示例的正确性,确保语法正确,并且符合用户提供的引用中的示例结构。例如,引用[2]中的代码使用了FilterList,需要展示类似的Java代码,但可能需要简化以便用户理解。 可能需要涉及的内容包括:单个过滤器的使用(如RowFilter、ValueFilter)、列族和列过滤(FamilyFilter, QualifierFilter)、值过滤器(ValueFilter)、分页过滤器(PageFilter)以及组合过滤器(FilterList)。每个部分需要给出具体的示例,并解释参数的意义。 同时,用户可能关心实际应用中的常见问题,比如如何组合多个条件,如何处理不同过滤器的性能影响,或者如何优化过滤查询。不过根据用户的问题,主要焦点还是使用方法和示例,所以需要集中在这些方面。 还需要检查是否有遗漏的常用过滤器,比如SingleColumnValueFilter,这在引用中没有提到,但实际应用中很常见。需要确保覆盖主要的过滤器类型,以提供全面的帮助。 最后,生成相关问题时要围绕HBase过滤器的进阶使用、性能优化、比较器类型以及异常处理,这样用户如果有进一步的问题,可以参考这些问题继续探索。</think>### HBase 过滤器使用方法及操作教程 HBase 过滤器(Filter)是数据查询时用于筛选数据的核心工具,支持对行键、列族、列限定符和值进行条件过滤。以下为分步骤使用方法及示例: --- #### 一、基础过滤器类型与用法 1. **行键过滤器(RowFilter)** 根据行键进行过滤,支持多种比较运算符(如`EQUAL`、`GREATER`等)和比较器(如`BinaryComparator`)。 **示例**:筛选行键等于`row1`的数据 ```java Filter rowFilter = new RowFilter( CompareOperator.EQUAL, new BinaryComparator(Bytes.toBytes("row1")) ); ``` 2. **列族过滤器(FamilyFilter)** 按列族名称过滤,支持子字符串匹配(`substring`)或二进制比较(`binary`)[^3]。 **示例**:筛选列族名为`cf1`的数据 ```java Filter familyFilter = new FamilyFilter( CompareOperator.EQUAL, new BinaryComparator(Bytes.toBytes("cf1")) ); ``` 3. **列限定符过滤器(QualifierFilter)** 根据列名(Qualifier)过滤。 **示例**:筛选列名为`age`的列 ```java Filter qualifierFilter = new QualifierFilter( CompareOperator.EQUAL, new BinaryComparator(Bytes.toBytes("age")) ); ``` 4. **值过滤器(ValueFilter)** 根据单元格值过滤,支持正则表达式或前缀匹配。 **示例**:筛选值以`yifu`开头的数据[^2] ```java Filter valueFilter = new ValueFilter( CompareOperator.EQUAL, new BinaryPrefixComparator(Bytes.toBytes("yifu")) ); ``` --- #### 二、组合过滤器(FilterList) 支持通过逻辑运算符`AND`(`MUST_PASS_ALL`)或`OR`(`MUST_PASS_ONE`)组合多个过滤器。 **示例**:同时满足行键为`row1`且值以`yifu`开头 ```java List<Filter> filters = new ArrayList<>(); filters.add(rowFilter); filters.add(valueFilter); FilterList filterList = new FilterList( FilterList.Operator.MUST_PASS_ALL, filters ); ``` --- #### 三、分页过滤器(PageFilter) 限制返回结果数量,常用于分页查询。 **示例**:每次返回最多10行数据 ```java Filter pageFilter = new PageFilter(10); ``` --- #### 四、实际应用示例 ```java Scan scan = new Scan(); scan.setFilter(filterList); // 设置过滤器链 try (ResultScanner scanner = table.getScanner(scan)) { for (Result result : scanner) { // 处理结果 } } ``` ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值