首页 > 其他分享 >Hbase中的过滤器_比较过滤器

Hbase中的过滤器_比较过滤器

时间:2024-11-20 16:41:26浏览次数:1  
标签:scan students 查询 过滤器 new Hbase HbaseTool 比较

  • 概念

HBase 的基本 API,包括增、删、改、查等。
增、删都是相对简单的操作,与传统的 RDBMS 相比,这里的查询操作略显苍白,只能根据特性的行键进行查询(Get)或者根据行键的范围来查询(Scan)。
HBase 不仅提供了这些简单的查询,而且提供了更加高级的过滤器(Filter)来查询。
过滤器可以根据列族、列、版本等更多的条件来对数据进行过滤,
基于 HBase 本身提供的三维有序(行键,列,版本有序),这些过滤器可以高效地完成查询过滤的任务,带有过滤器条件的 RPC 查询请求会把过滤器分发到各个 RegionServer(这是一个服务端过滤器),这样也可以降低网络传输的压力。
使用过滤器至少需要两类参数:
一类是抽象的操作符,另一类是比较器

  • 作用

过滤器的作用是在服务端判断数据是否满足条件,然后只将满足条件的数据返回给客户端

  • 种类

过滤器的类型很多,但是可以分为三大类:
比较过滤器:可应用于rowkey、列簇、列、列值过滤器
专用过滤器:只能适用于特定的过滤器
包装过滤器:包装过滤器就是通过包装其他过滤器以实现某些拓展的功能。

  • 比较过滤器

所有比较过滤器均继承自 CompareFilter。创建一个比较过滤器需要两个参数,分别是比较运算符比较器实例

  • 比较运算符

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

  • 常见的六大比较器
  • 1、BinaryComparator

等值比较器

  • 2、BinaryPrefixComparator

前缀比较器,只是比较左端前缀的数据是否相同

  • 3、NullComparator

判断给定的是否为空

  • 4、BitComparator

按位比较

  • 5、RegexStringComparator

提供一个正则的比较器,仅支持 EQUAL 和非EQUAL

  • 6、SubstringComparator

包含比较器,判断提供的子串是否出现在中

一、RowFilter 行键过滤器

需求:通过RowFilter与BinaryComparator过滤比rowKey 1500100010小的所有值出来

import com.wll.utils.HbaseTool;
import org.apache.hadoop.hbase.CompareOperator;
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.client.Table;
import org.apache.hadoop.hbase.filter.BinaryComparator;
import org.apache.hadoop.hbase.filter.RowFilter;
import org.apache.hadoop.hbase.util.Bytes;

public class HbaseBiJiaoFilter {
    public static void main(String[] args) throws Exception{
        //通过RowFilter与BinaryComparator过滤比rowKey 1500100010小的所有值出来
        xuQiu1();
    }

    public static void xuQiu1() throws Exception{
        //通过RowFilter与BinaryComparator过滤比rowKey 1500100010小的所有值出来
        //获取表对象
        Table students = HbaseTool.getOneTable("students");

        //全表查询
        Scan scan = new Scan();
        //创建等值比较器
        BinaryComparator binaryComparator = new BinaryComparator(Bytes.toBytes("1500100010"));
        //创建行键过滤器
        //public RowFilter(final CompareOperator op,final ByteArrayComparable rowComparator)
        RowFilter rowFilter = new RowFilter(CompareOperator.LESS, binaryComparator);
        //设置过滤器
        scan.setFilter(rowFilter);

        ResultScanner scanner = students.getScanner(scan);
        for (Result result : scanner) {
            HbaseTool.printResult(result);
        }
        HbaseTool.close();

    }
}

二、列簇过滤器:FamilyFilter

需求:通过FamilyFilter与SubstringComparator查询列簇名包含in的所有列簇下面的数据

public static void xuQiu2() throws Exception{
        //通过FamilyFilter与SubstringComparator查询列簇名包含in的所有列簇下面的数据
        //获取表对象
        Table students = HbaseTool.getOneTable("students");

        //全表查询
        Scan scan = new Scan();
        //创建包含比较器
        SubstringComparator in = new SubstringComparator("in");
        //创建列簇过滤器
        FamilyFilter familyFilter = new FamilyFilter(CompareOperator.EQUAL, in);
        //设置过滤器
        scan.setFilter(familyFilter);

        ResultScanner scanner = students.getScanner(scan);
        for (Result result : scanner) {
            HbaseTool.printResult(result);
        }
        HbaseTool.close();
    }

三、列名过滤器:QualifierFilter

需求:通过QualifierFilter与SubstringComparator查询列名包含na的列的值

public static void xuQiu3() throws Exception{
//        通过QualifierFilter与SubstringComparator查询列名包含na的列的值
        //获取表对象
        Table students = HbaseTool.getOneTable("students");

        //全表查询
        Scan scan = new Scan();
        //创建包含比较器
        SubstringComparator in = new SubstringComparator("na");
        //创建列名过滤器
        QualifierFilter qualifierFilter = new QualifierFilter(CompareOperator.EQUAL, in);
        //设置过滤器
        scan.setFilter(qualifierFilter);

        ResultScanner scanner = students.getScanner(scan);
        for (Result result : scanner) {
            HbaseTool.printResult(result);
        }
        HbaseTool.close();
    }

四、列值过滤器:ValueFilter

需求:通过ValueFilter与BinaryPrefixComparator过滤出所有的cell中值以 "张" 开头的学生
只会查询出列值是张前缀的这一列,其他列不查

public static void xuQiu4() throws Exception{
//        通过ValueFilter与BinaryPrefixComparator过滤出所有的cell中值以 "张" 开头的学生
        //获取表对象
        Table students = HbaseTool.getOneTable("students");

        //全表查询
        Scan scan = new Scan();
        //创建前缀比较器
        BinaryPrefixComparator binaryPrefixComparator = new BinaryPrefixComparator(Bytes.toBytes("张"));
        //创建列值过滤器
        ValueFilter valueFilter = new ValueFilter(CompareOperator.EQUAL, binaryPrefixComparator);
        //设置过滤器
        scan.setFilter(valueFilter);

        ResultScanner scanner = students.getScanner(scan);
        for (Result result : scanner) {
            HbaseTool.printResult(result);
        }
        HbaseTool.close();
    }

五、组合过滤器

需求:查询列名叫name且,列值以'张'开头的

public static void xuQiu5() throws Exception{
        //查询列名叫name且,列值以'张'开头的
        //获取表对象
        Table students = HbaseTool.getOneTable("students");

        //全表查询
        Scan scan = new Scan();
        //创建等值比较器
        BinaryComparator binaryComparator = new BinaryComparator(Bytes.toBytes("name"));
        //创建前缀比较器
        BinaryPrefixComparator binaryPrefixComparator = new BinaryPrefixComparator(Bytes.toBytes("张"));
        //创建列名过滤器
        QualifierFilter qualifierFilter = new QualifierFilter(CompareOperator.EQUAL, binaryComparator);
        //创建列值过滤器
        ValueFilter valueFilter = new ValueFilter(CompareOperator.EQUAL, binaryPrefixComparator);
        //创建过滤器集合
        FilterList filterList = new FilterList();
        //添加过滤器到过滤器集合中
        filterList.addFilter(qualifierFilter);
        filterList.addFilter(valueFilter);
        //设置过滤器
        scan.setFilter(filterList);

        ResultScanner scanner = students.getScanner(scan);
        for (Result result : scanner) {
            HbaseTool.printResult(result);
        }
        HbaseTool.close();
    }

标签:scan,students,查询,过滤器,new,Hbase,HbaseTool,比较
From: https://www.cnblogs.com/w-ll/p/18558720

相关文章

  • Java操作Hbase数据库
    ```plaintext/*Hbaseapi中基础我们要做的任务:1、如何创建一张表2、如何删除一张表3、如何向hbase表中插入一列数据4、如何向hbase表中插入一批数据5、如何获取一列数据6、如何获取批量列数据7、如何创建预......
  • h基于docker搭建hadoop+hive+spark+hbase+zookeeper+scale集群adoop集群搭建(docker)
     基于docker搭建hadoop+hive+spark+hbase+zookeeper+scale集群 1、设置主机上的虚拟缓存当本地内存不足时,可以使用虚拟内存将一些内存数据转移到硬盘上,从而扩展计算机的内存容量。这样可以让计算机运行更复杂、更占用内存的程序,不会出现内存不足的情况。减轻物理存储器......
  • Java易混知识点列表比较
    类一级成员与实例成员类一级成员实例成员属于类本身类创建的实例对象举例static(变量/方法/初始化块)、内部类普通成员直接访问类名.member对象.memberclasssuperc{inti=5;voidshow(){System.out.println("theiis:"+i);}}publicc......
  • i春秋-GetFlag(md5加密,字符串比较绕过)
    练习平台地址竞赛中心题目描述 题目内容你好,单身狗,这是一个迷你文件管理器,你可以登录和下载文件,甚至得到旗帜 点击登录 发现capture需要满足条件substr(md5(captcha),0,6)=xxxxxx编写python脚本破解验证码importhashlibdefgetMd5(index):"""函......
  • HBaseAPI
    jdbc连接数据库6步1.注册驱动2.创建数据库连接对象、3.创建数据库操作对象4.对数据库进行操作5.解决查询结果6.关闭数据库资源Hbaseapi基础我们要做的任务1、如何创建一张表2、如何删除一张表3、如何向hbase表中插入一列数据4、如何......
  • R语言caretEnsemble包的caretList函数一次性构建多个机器学习模型、caret包的resample
    R语言caretEnsemble包的caretList函数一次性构建多个机器学习模型、caret包的resamples函数比较在同一数据集上多个机器学习模型的比较结果目录R语言使用caretEnsemble包的caretList函数一次性构建多个机器学习模型、并使用caret包的resamples函数比较在同一数据集上多个机......
  • 极致高效的数据处理:位图、布隆过滤器与哈希切分的奇妙之旅
    文章目录前言......
  • 【python系列】python数据类型的分类和比较
    一、数据类型的定义在程序设计的类型系统中,数据类型(英语:Datatype),又称资料型态、资料型别,是用来约束数据的解释。——Wikipedia从定义我们可以看出来,数字类型的理解最主要的是约束数据的解释,每个类型都有他们自己所使用得场景,这个就是数字类型的分类,分类的结果可以方便......
  • HBase的常用命令
    一、general类1、查看集群的状态status2、查看数据库版本version3、显示当前用户和组whoami4、查看操作表的命令table_help5、退出hbaseexit或者ctrl+c二、DDL相关注:DDL是用于定义和管理数据库中的结构的命令,例如创建,删除,修改表等操作1、创建表注:创建表的时候需......
  • Hbase架构和搭建
    一、了解Hbase1、什么是hbase?HBase是一个高可靠性,高性能、面向列,可伸缩的分布式存储系统,用于存储海量结构化或者半结构化,非结构化的数据(底层是字节数组做存储的)二、HBase相关概念1、数据模型(三维有序)一个hbase表中,行键之间是按照字典顺序排序的一行中每一个列名按照字典顺......