欢迎投稿

今日深度:

HBASE(三)—— HBase 的过滤器,

HBASE(三)—— HBase 的过滤器,


HBase 的过滤器主要用来实现复杂查询的,类似 where 条件,常用的有以下几种:

  • 列值过滤器:SingleColumnValueFilter
  • 列名前缀过滤器:ColumnPrefixFilter
  • 多个列名前缀过滤器:MultipleColumnPrefixFilter
  • 行键过滤器:RowFilter
  • 过滤器的组合使用

一、列值过滤器

/**
 * 单一列值过滤器
 *
 * 查询薪水等于3000的员工
 *
 * @throws Exception
 */
public static void testSingleColumnValueFilter() throws Exception {
    Configuration conf = new Configuration();
    conf.set("hbase.zookeeper.quorum", "192.168.220.111");

    // 创建表的客户端
    HTable emp = new HTable(conf, "emp");

    // 创建过滤器(筛选出empinfo列族的sal列值等于3000的记录)
    SingleColumnValueFilter filter = new SingleColumnValueFilter(Bytes.toBytes("empinfo"), // 列族
            Bytes.toBytes("sal"), // 列名
            CompareFilter.CompareOp.EQUAL, // 等值关系
            Bytes.toBytes("3000")); // 值

    // 创建一个Scanner
    Scan scanner = new Scan();
    scanner.setFilter(filter);

    // 执行查询
    ResultScanner rs = emp.getScanner(scanner);
    for (Result r : rs) {
        byte[] value = r.getValue(Bytes.toBytes("empinfo"), Bytes.toBytes("ename"));
        String ename = Bytes.toString(value);
        System.out.println(ename);
    }
    emp.close();
}

二、列名前缀过滤器

/**
 * 列名前缀过滤器
 *
 * 查询出所有员工的姓名
 *
 * @throws Exception
 */
public static void testColumnPrefixFilter() throws Exception {
    Configuration conf = new Configuration();
    conf.set("hbase.zookeeper.quorum", "192.168.220.111");

    HTable emp = new HTable(conf, "emp");

    // 定义列名前缀过滤器
    ColumnPrefixFilter filter = new ColumnPrefixFilter(Bytes.toBytes("ename"));

    Scan scanner = new Scan();
    scanner.setFilter(filter);

    // 执行查询
    ResultScanner rs = emp.getScanner(scanner);
    for (Result r : rs) {
        byte[] value = r.getValue(Bytes.toBytes("empinfo"), Bytes.toBytes("ename"));
        String ename = Bytes.toString(value);
        System.out.println(ename);
    }
    emp.close();
}

三、多个列名前缀过滤器

/**
 * 多个列名前缀过滤器
 *
 * 查询所有员工的姓名和薪水
 *
 * @throws Exception
 */
public static void testMultipleColumnPrefixFilter() throws Exception {
    Configuration conf = new Configuration();
    conf.set("hbase.zookeeper.quorum", "192.168.220.111");

    HTable emp = new HTable(conf, "emp");

    // 存储多个列名的二维数组
    byte[][] prefixs = new byte[][]{Bytes.toBytes("ename"), Bytes.toBytes("sal")};

    MultipleColumnPrefixFilter filter = new MultipleColumnPrefixFilter(prefixs);

    Scan scanner = new Scan();
    scanner.setFilter(filter);

    // 执行查询
    ResultScanner rs = emp.getScanner(scanner);
    for (Result r : rs) {
        byte[] value1 = r.getValue(Bytes.toBytes("empinfo"), Bytes.toBytes("ename"));
        byte[] value2 = r.getValue(Bytes.toBytes("empinfo"), Bytes.toBytes("sal"));

        String ename = Bytes.toString(value1);
        String sal = Bytes.toString(value2);

        System.out.println("ename = " + ename + ", sal = " + sal);
    }
    emp.close();
}

四、行键过滤器

/**
 * 行键过滤器
 *
 * 查询行键为7839的员工的姓名和薪水
 *
 * @throws Exception
 */
public static void testRowFilter() throws Exception {
    Configuration conf = new Configuration();
    conf.set("hbase.zookeeper.quorum", "192.168.220.111");

    HTable emp = new HTable(conf, "emp");

    // 构造一个行键过滤器(第二个参数可以是一个正则表达式)
    RowFilter filter = new RowFilter(CompareFilter.CompareOp.EQUAL, new RegexStringComparator("7839"));

    // 创建一个扫描器
    Scan scanner = new Scan();
    scanner.setFilter(filter);

    // 执行查询
    ResultScanner rs = emp.getScanner(scanner);
    for (Result r : rs) {
        byte[] value1 = r.getValue(Bytes.toBytes("empinfo"), Bytes.toBytes("ename"));
        byte[] value2 = r.getValue(Bytes.toBytes("empinfo"), Bytes.toBytes("sal"));
        String ename = Bytes.toString(value1);
        String sal = Bytes.toString(value2);
        System.out.println("行键为7839的员工的ename = " + ename + ", sal = " + sal);
    }
    emp.close();
}

五、组合使用过滤器

/**
 * 多个过滤器互相组合
 *
 * 查询员工号为7839的员工的姓名
 *
 * @throws Exception
 */
public static void testFilterChain() throws Exception {
    Configuration conf = new Configuration();
    conf.set("hbase.zookeeper.quorum", "192.168.220.111");

    HTable emp = new HTable(conf, "emp");

    // 1.用于过滤员工号的行键过滤器
    RowFilter filter1 = new RowFilter(CompareFilter.CompareOp.EQUAL, new RegexStringComparator("7839"));
    // 2.用于过滤列名的列名过滤器
    ColumnPrefixFilter filter2 = new ColumnPrefixFilter(Bytes.toBytes("ename"));

    // 创建一个Filter的list
    FilterList filterList = new FilterList(FilterList.Operator.MUST_PASS_ALL);
    filterList.addFilter(filter1);
    filterList.addFilter(filter2);

    // 创建一个扫描器
    Scan scanner = new Scan();
    scanner.setFilter(filterList);

    // 执行查询
    ResultScanner rs = emp.getScanner(scanner);
    for (Result r : rs) {
        byte[] value1 = r.getValue(Bytes.toBytes("empinfo"), Bytes.toBytes("ename"));
        byte[] value2 = r.getValue(Bytes.toBytes("empinfo"), Bytes.toBytes("sal"));
        String ename = Bytes.toString(value1);
        String sal = Bytes.toString(value2);
        System.out.println("7839\t" + ename + "\t" + sal);
    }
    emp.close();
}

www.htsjk.Com true http://www.htsjk.com/hbase/37919.html NewsArticle HBASE(三)—— HBase 的过滤器, HBase 的过滤器主要用来实现复杂查询的,类似 where 条件,常用的有以下几种: 列值过滤器:SingleColumnValueFilter 列名前缀过滤器:ColumnPrefixFilter 多个列名...
相关文章
    暂无相关文章
评论暂时关闭