前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >HBase的JavaAPI使用--进阶篇--过滤器的使用

HBase的JavaAPI使用--进阶篇--过滤器的使用

作者头像
大数据梦想家
发布2021-01-26 10:56:05
1.5K0
发布2021-01-26 10:56:05
举报
文章被收录于专栏:大数据成长之路

本篇博客,小菌为大家带来HBase的进阶使用,关于基础入门操作大家可以去阅览小菌之前的博客《HBase的JavaAPI使用–基础篇》

在展示代码之前先为大家介绍一下过滤器,同时它也是我们这篇博客介绍的主角。

过滤器的类型很多,但是可以分为两大类——比较过滤器,专用过滤器 过滤器的作用是在服务端判断数据是否满足条件,然后只将满足条件的数据返回给客户端;

hbase过滤器的比较运算符:

LESS < LESS_OR_EQUAL <= EQUAL = NOT_EQUAL <> GREATER_OR_EQUAL >= GREATER > NO_OP 排除所有

Hbase过滤器的专用过滤器(指定比较机制):

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

接下来正式上我们的代码!

一、比较过滤器

1、rowKey过滤器RowFilter

通过RowFilter过滤比rowKey 0003小的所有值出来

代码语言:javascript
复制
/**
     * hbase 行键过滤器 RowFilter
     * [通过RowFilter过滤  比rowKey  0003小的所有值出来]
     * @throws Exception
     */
    @Test
    public void rowKeyFilter() throws Exception{

        // 连接 数据库
        Configuration conf = new Configuration();

        conf.set("hbase.zookeeper.quorum","node01:2181,node02:2181,node03:2181");

        Connection connection = ConnectionFactory.createConnection(conf);

        //读取表
        Table mytest1 = connection.getTable(TableName.valueOf("mytest1"));

        Scan scan = new Scan();

        //创建一个过滤器,并将其添加至scan对象   <=
        RowFilter rowFilter = new RowFilter(LESS, new BinaryComparator(Bytes.toBytes("0003")));

        scan.setFilter(rowFilter);

        // scanner 为 行数据result的集合
        ResultScanner scanner = mytest1.getScanner(scan);

        for (Result result : scanner) {

            // 获取 rowkey
            System.out.println("rowkey:"+Bytes.toString(result.getRow()));

            // 指定列族以及列 打印 列 当中的数据出来
            System.out.println("id:"+Bytes.toInt(result.getValue("f1".getBytes(),"id".getBytes())));

            System.out.println("age:"+Bytes.toInt(result.getValue("f1".getBytes(),"age".getBytes())));

            System.out.println("name:"+Bytes.toString(result.getValue("f1".getBytes(),"name".getBytes())));

        }

        mytest1.close();

        connection.close();


    }
2、列族过滤器FamilyFilter

查询比f2列族小的所有的列族内的数据

代码语言:javascript
复制
 /**
     * 列族过滤器 FamilyFilter
     * [查询比f2列族小的所有的列族内的数据]
     * @throws Exception
     */
    @Test
    public void familyFilter() throws Exception{

        // 获取连接
        Configuration conf = new Configuration();

        conf.set("hbase.zookeeper.quorum","node01:2181,node02:2181,node03:2181");

        Connection connection = ConnectionFactory.createConnection(conf);

        // 获取表
        Table mytest1 = connection.getTable(TableName.valueOf("mytest1"));

        Scan scan = new Scan();

        // 创建一个过滤器并添置给scan对象
        FamilyFilter familyFilter  = new FamilyFilter(LESS, new BinaryComparator("f2".getBytes()));

        scan.setFilter(familyFilter);

        ResultScanner resultScanner = mytest1.getScanner(scan);

        for (Result result : resultScanner) {

            // 获取rowkey
            System.out.println(Bytes.toString(result.getRow()));


            System.out.println(Bytes.toString(result.getValue("f1".getBytes(),"name".getBytes())));

        }

        mytest1.close();

        connection.close();


    }
3、列过滤器QualifierFilter

只查询name列的值</font

代码语言:javascript
复制
 /**
     * hbase 列过滤器
     * [只查询name列]
     * @throws Exception
     */

    @Test
    public void qualifier() throws Exception{

        // 获取连接
        Configuration conf = new Configuration();

        conf.set("hbase.zookeeper.quorum","node01:2181,node02:2181,node03:2181");

        Connection connection = ConnectionFactory.createConnection(conf);

        // 获取表
        Table mytest1 = connection.getTable(TableName.valueOf("mytest1"));

        //全表扫描
        Scan scan = new Scan();

        QualifierFilter qualifierFilter = new QualifierFilter(EQUAL, new SubstringComparator("name"));

        scan.setFilter(qualifierFilter);

        ResultScanner scanner = mytest1.getScanner(scan);

        //result 是一行数据
        for (Result result : scanner) {

            // 获取 rowkey
            System.out.println(Bytes.toString(result.getRow()));

            // 指定列族 以及列打印当中的数据
            System.out.println(Bytes.toString(result.getValue("f1".getBytes(),"id".getBytes())));

            System.out.println(Bytes.toString(result.getValue("f1".getBytes(),"name".getBytes())));

        }

        // 关闭资源
        mytest1.close();
        connection.close();


    }
4、列值过滤器ValueFilter

查询所有列当中包含8的数据

代码语言:javascript
复制
 /**
     * 列值过滤器ValueFilter
     * [查询所有列当中包含8的数据]
     * @throws Exception
     */
    @Test
public void valueFilter()throws Exception {

        // 获取连接
        Configuration conf = new Configuration();

        conf.set("hbase.zookeeper.quorum","node01:2181,node02:2181,node03:2181");

        Connection connection = ConnectionFactory.createConnection(conf);

        // 获取表
        Table mytest1 = connection.getTable(TableName.valueOf("mytest1"));

        //全表扫描
        Scan scan = new Scan();

        ValueFilter valueFilter = new ValueFilter(EQUAL, new SubstringComparator("30"));

        scan.setFilter(valueFilter);

        ResultScanner scanner = mytest1.getScanner(scan);

        for (Result result : scanner) {

            // 获取 rowkey
            System.out.println(Bytes.toString(result.getRow()));

            //指定列族 以及 列打印当中的数据出来
            //System.out.println(Bytes.toInt(result.getValue("f1".getBytes(),"id".getBytes())));

            System.out.println(Bytes.toString(result.getValue("f2".getBytes(),"phone".getBytes())));

}

        // 关闭资源
        mytest1.close();
        connection.close();


}

二、专用过滤器

1、单列值过滤器 SingleColumnValueFilter

SingleColumnValueFilter会返回满足条件的整列值的所有字段

代码语言:javascript
复制
/**
     * 单列值过滤器,返回满足条件的整行数据
     */
    @Test
    public void singleColumnFilter() throws IOException {
        //获取连接
        Configuration configuration = HBaseConfiguration.create();
        configuration.set("hbase.zookeeper.quorum","node01:2181,node02:2181,node03:2181");
        Connection connection = ConnectionFactory.createConnection(configuration);
        Table myuser = connection.getTable(TableName.valueOf("myuser"));
        Scan scan = new Scan();
        SingleColumnValueFilter singleColumnValueFilter = new SingleColumnValueFilter("f1".getBytes(), "name".getBytes(), CompareFilter.CompareOp.EQUAL, "刘备".getBytes());
        scan.setFilter(singleColumnValueFilter);
        ResultScanner resultScanner = myuser.getScanner(scan);
        for (Result result : resultScanner) {
            //获取rowkey
            System.out.println(Bytes.toString(result.getRow()));
            //指定列族以及列打印列当中的数据出来
            System.out.println(Bytes.toInt(result.getValue("f1".getBytes(), "id".getBytes())));
            System.out.println(Bytes.toString(result.getValue("f1".getBytes(), "name".getBytes())));
            System.out.println(Bytes.toString(result.getValue("f2".getBytes(), "phone".getBytes())));
        }
        myuser.close();
    }
2、列值排除过滤器SingleColumnValueExcludeFilter

与SingleColumnValueFilter相反,会排除掉指定的列,其他的列全部返回。

3.rowkey前缀过滤器PrefixFilter

查询以00开头的所有前缀的rowkey

代码语言:javascript
复制
 /**
     * rowkey前缀过滤器PrefixFilter
     * [查询以00开头的所有前缀的rowkey]
     *
     * @throws IOException
     */
    @Test
    public void preFilter() throws IOException{

        //获取连接
        Configuration configuration = HBaseConfiguration.create();
        configuration.set("hbase.zookeeper.quorum","node01:2181,node02:2181,node03:2181");
        Connection connection = ConnectionFactory.createConnection(configuration);

        //获取表
        Table mytest1 = connection.getTable(TableName.valueOf("mytest1"));

        //扫描全表
        Scan scan = new Scan();

        PrefixFilter prefixFilter = new PrefixFilter("00".getBytes());
        scan.setFilter(prefixFilter);

        ResultScanner resultScanner = mytest1.getScanner(scan);

        // result 代表一行数据
        for (Result result : resultScanner) {

            // 获取rowkey
            System.out.println(Bytes.toString(result.getRow()));

            //指定列族以及列打印列当中的数据出来
            System.out.println(Bytes.toInt(result.getValue("f1".getBytes(),"id".getBytes())));

            System.out.println(Bytes.toString(result.getValue("f1".getBytes(),"name".getBytes())));

            System.out.println(Bytes.toString(result.getValue("f2".getBytes(),"phone".getBytes())));


        }

        mytest1.close();
        connection.close();

    }
4、分页过滤器PageFilter

通过pageFilter实现分页过滤器

代码语言:javascript
复制
/**
     * 分页过滤器PageFilter
     * [通过pageFilter实现分页过滤器]
     * @throws IOException
     */
    @Test
    public void pageFilter2() throws IOException {
        // 获取连接
        Configuration configuration = HBaseConfiguration.create();
        configuration.set("hbase.zookeeper.quorum", "node01:2181,node02:2181,node03:2181");
        Connection connection = ConnectionFactory.createConnection(configuration);

        // 获取表
        Table myuser = connection.getTable(TableName.valueOf("mytest1"));
        int pageNum = 3;
        int pageSize = 2;

        Scan scan = new Scan();
        if (pageNum == 1) {
            PageFilter filter = new PageFilter(pageSize);
            scan.setStartRow(Bytes.toBytes(""));
            scan.setFilter(filter);
            scan.setMaxResultSize(pageSize);
            ResultScanner scanner = myuser.getScanner(scan);
            for (Result result : scanner) {
                //获取rowkey
                System.out.println(Bytes.toString(result.getRow()));
                //指定列族以及列打印列当中的数据出来
//            System.out.println(Bytes.toInt(result.getValue("f1".getBytes(), "id".getBytes())));
                System.out.println(Bytes.toString(result.getValue("f1".getBytes(), "name".getBytes())));
                //System.out.println(Bytes.toString(result.getValue("f2".getBytes(), "phone".getBytes())));
            }

        }else{
            String startRowKey ="";
            PageFilter filter = new PageFilter((pageNum - 1) * pageSize + 1  );
            scan.setStartRow(startRowKey.getBytes());
            scan.setMaxResultSize((pageNum - 1) * pageSize + 1);
            scan.setFilter(filter);
            ResultScanner scanner = myuser.getScanner(scan);
            for (Result result : scanner) {
                byte[] row = result.getRow();
                startRowKey =  new String(row);
            }
            Scan scan2 = new Scan();
            scan2.setStartRow(startRowKey.getBytes());
            scan2.setMaxResultSize(Long.valueOf(pageSize));
            PageFilter filter2 = new PageFilter(pageSize);
            scan2.setFilter(filter2);

            ResultScanner scanner1 = myuser.getScanner(scan2);
            for (Result result : scanner1) {
                byte[] row = result.getRow();
                System.out.println(new String(row));
            }
        }
        myuser.close();

        connection.close();


    }

三、多过滤器综合查询FilterList

需求:使用SingleColumnValueFilter查询f1列族,name为刘备的数据,并且同时满足rowkey的前缀以00开头的数据(PrefixFilter)

代码语言:javascript
复制
/**
     * 多过滤器综合查询FilterList
     * 需求:使用SingleColumnValueFilter查询f1列族,name为刘备的数据,并且同时满足rowkey的前缀以00开头的数据(PrefixFilter)
     * @throws Exception
     */
    @Test
    public void manyFilter() throws Exception{

        //获取连接
        Configuration configuration = HBaseConfiguration.create();
        configuration.set("hbase.zookeeper.quorum","node01:2181,node02:2181,node03:2181");
        Connection connection = ConnectionFactory.createConnection(configuration);

        //获取表
        Table mytest1 = connection.getTable(TableName.valueOf("mytest1"));

        //扫描全表
        Scan scan = new Scan();

        FilterList filterList = new FilterList();

        // 单列过滤
        SingleColumnValueFilter singleColumnValueFilter = new SingleColumnValueFilter("f1".getBytes(), "name".getBytes(), EQUAL, "刘备".getBytes());

        // rowkey 前缀过滤
        PrefixFilter prefixFilter = new PrefixFilter("00".getBytes());

        filterList.addFilter(singleColumnValueFilter);
        filterList.addFilter(prefixFilter);

        // 设置过滤
        scan.setFilter(filterList);

        ResultScanner scanner = mytest1.getScanner(scan);

        for (Result result : scanner) {

            //获取rowkey
            System.out.println(Bytes.toString(result.getRow()));

            //指定列族以及列 打印当中的数据出来
            System.out.println(Bytes.toInt(result.getValue("f1".getBytes(),"id".getBytes())));

            System.out.println(Bytes.toString(result.getValue("f1".getBytes(),"name".getBytes())));

            System.out.println(Bytes.toString(result.getValue("f2".getBytes(),"phone".getBytes())));

        }

        mytest1.close();
        connection.close();

    }

好了到这里,关于过滤器的使用就到这里了,接下来要为大家展示如何调用API删除表数据和表!

四.删除数据

根据rowkey删除数据

代码语言:javascript
复制
/**
     * 根据rowkey删除数据
     * @throws Exception
     */
    @Test
    public void deleteByRowKey() throws Exception{

        //获取连接
        Configuration configuration = HBaseConfiguration.create();
        configuration.set("hbase.zookeeper.quorum","node01:2181,node02:2181,node03:2181");
        Connection connection = ConnectionFactory.createConnection(configuration);

        //获取表
        Table mytest1 = connection.getTable(TableName.valueOf("mytest1"));

        //根据RowKey 确定需要删除掉的行
        Delete delete = new Delete("0001".getBytes());

        mytest1.delete(delete);


        //关闭连接
        mytest1.close();
        connection.close();

    }

五.删除表

删除指定的数据表

代码语言:javascript
复制
 @Test
    public void deleteTable() throws Exception{

        //获取连接
        Configuration configuration = HBaseConfiguration.create();
        configuration.set("hbase.zookeeper.quorum","node01:2181,node02:2181,node03:2181");
        Connection connection = ConnectionFactory.createConnection(configuration);

        //获取表
        Table mytest1 = connection.getTable(TableName.valueOf("mytest1"));

        //创建一个管理员对象
        Admin admin = connection.getAdmin();
        admin.disableTable(TableName.valueOf("myuser"));

        admin.deleteTable(TableName.valueOf("myuser"));


        // 关闭资源
        admin.close();

        mytest1.close();
        connection.close();

    }

这里需要注意一下,在删除数据表之前一定要先禁用数据表

好了,看到这里也很不容易,给热爱学习的你们点个赞!

在这里插入图片描述
在这里插入图片描述

话说回来,上面的所有代码小菌都亲测过没问题的!有疑惑的小伙伴们可以私信我哟(^U^)ノ~YO

本次的分享就到这里了,受益的小伙伴们,不要忘了点赞关注小菌٩(๑❛ᴗ❛๑)۶

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019/12/18 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、比较过滤器
    • 1、rowKey过滤器RowFilter
      • 2、列族过滤器FamilyFilter
        • 3、列过滤器QualifierFilter
          • 4、列值过滤器ValueFilter
          • 二、专用过滤器
            • 1、单列值过滤器 SingleColumnValueFilter
              • 2、列值排除过滤器SingleColumnValueExcludeFilter
                • 3.rowkey前缀过滤器PrefixFilter
                  • 4、分页过滤器PageFilter
                  • 三、多过滤器综合查询FilterList
                  • 四.删除数据
                  • 五.删除表
                  相关产品与服务
                  TDSQL MySQL 版
                  TDSQL MySQL 版(TDSQL for MySQL)是腾讯打造的一款分布式数据库产品,具备强一致高可用、全球部署架构、分布式水平扩展、高性能、企业级安全等特性,同时提供智能 DBA、自动化运营、监控告警等配套设施,为客户提供完整的分布式数据库解决方案。
                  领券
                  问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档