什么是Hbase过滤器?有什么用

因为Hbase没有sql,一些复杂的查询就需要用过滤器来实现.

过滤器

为方便后续输出查看结果,先封装一个打印结果的函数

def printScanner(resultScanner: ResultScanner): Unit ={val value: util.Iterator[Result] = resultScanner.iterator()while(value.hasNext){val result: Result = value.next()HbaseUtil.printResult(result)}}

单列值过滤器

比如如果用sql查询

select * where name ="zhaoyun"

用hbase实现是这样的

 def testColumnFilter(): Unit = {//单个列的值的二进制比较的构造函数。 如果找到该列并且条件通过,则将输出该行的所有列。 如果条件失败,则不会val filter1 = new SingleColumnValueFilter(Bytes.toBytes("f1"), Bytes.toBytes("name"), CompareOp.EQUAL, Bytes.toBytes("zhaoyun"))filter1.setFilterIfMissing(true)val scan = new Scan()scan.setFilter(filter1)val table: Table = HbaseUtil.getTable("ns1:students")val scanner: ResultScanner = table.getScanner(scan)printScanner(scanner)}

RegexStringComparator

select * where name  like "^zha"
 def testRegexStringComparator(): Unit ={val comparator = new RegexStringComparator("^zhao")//需要指名列族,列名,值得特征val filter = new SingleColumnValueFilter(Bytes.toBytes("f1"), Bytes.toBytes("name"), CompareFilter.CompareOp.EQUAL, comparator)filter.setFilterIfMissing(true)val table: Table = HbaseUtil.getTable("ns1:students")val scan=new Scan()//所有的filter都是绑定到scan对象上的scan.setFilter(filter)val scanner: ResultScanner = table.getScanner(scan)printScanner(scanner)}

SubstringComparator

筛选name的value包含"zh"子串的

 def testSubStringComparator(): Unit ={val comparator = new SubstringComparator("zh")val filter = new SingleColumnValueFilter(Bytes.toBytes("f1"), Bytes.toBytes("name"), CompareFilter.CompareOp.EQUAL, comparator)filter.setFilterIfMissing(true)val table: Table = HbaseUtil.getTable("ns1:students")val scan=new Scan()scan.setFilter(filter)val scanner: ResultScanner = table.getScanner(scan)printScanner(scanner)}
rk00002  f1  age 23
rk00002 f1  gender  f
rk00002 f1  name    zhenji
rk00003 f1  age 25
rk00003 f1  gender  m
rk00003 f1  name    zhaoyun

BinaryPrefixComparator

无非就是参数是Byte数组罢了,其余的和上面没有区别

 def testbinaryPrefixComparator(): Unit ={//构建比较强val comparator = new BinaryPrefixComparator(Bytes.toBytes("zh"))//给单列值过滤器传参val filter = new SingleColumnValueFilter(Bytes.toBytes("f1"), Bytes.toBytes("name"), CompareFilter.CompareOp.EQUAL, comparator)filter.setFilterIfMissing(true)val scan = new Scan()scan.setFilter(filter)val table: Table = HbaseUtil.getTable("ns1:students")val scanner: ResultScanner = table.getScanner(scan)printScanner(scanner)}

FamilyFilter

直接用的话会查询到列族下面所有的单元格

  def testFamilyFilter(): Unit ={val comparator = new BinaryComparator(Bytes.toBytes("f1"))val filter = new FamilyFilter(CompareFilter.CompareOp.EQUAL,comparator)val scan = new Scan()scan.setFilter(filter)val table: Table = HbaseUtil.getTable("ns1:students")val scanner: ResultScanner = table.getScanner(scan)printScanner(scanner)}

QualifierFilter

查询列名包含"zh"的

 def testQualifierFiletr(): Unit ={val comparator = new SubstringComparator("na")val filter = new QualifierFilter(CompareFilter.CompareOp.EQUAL,comparator)val scan = new Scan()scan.setFilter(filter)val table: Table = HbaseUtil.getTable("ns1:students")val scanner: ResultScanner = table.getScanner(scan)printScanner(scanner)}

运行结果,只是打印该列的所有值,无关的kv对没有

rk00002  f1  name    zhenji
rk00003 f1  name    zhaoyun
rk00004 f1  name    liubei
rk0001  f1  name    lisi

ColumnPrefixFilter

看名字就明白了,列名前缀过滤器

 def testColumPrefixFilter(): Unit ={val filter = new ColumnPrefixFilter(Bytes.toBytes("ag"))val scan = new Scan()scan.setFilter(filter)val table: Table = HbaseUtil.getTable("ns1:students")val scanner: ResultScanner = table.getScanner(scan)printScanner(scanner)}

运行结果

rk00002  f1  age 23
rk00003 f1  age 25
rk00004 f1  age 30
rk0001  f1  age 15

ColumnRangeFilter

def testColumnRageFilter(): Unit ={//列名属于age到name范围的,true表示包含,false表示不包含val filter = new ColumnRangeFilter(Bytes.toBytes("age"),true,Bytes.toBytes("name"),false)val scan = new Scan()scan.setFilter(filter)val table: Table = HbaseUtil.getTable("ns1:students")val scanner: ResultScanner = table.getScanner(scan)printScanner(scanner)}

运行结果

rk00002  f1  age 23
rk00002 f1  gender  f
rk00003 f1  age 25
rk00003 f1  gender  m
rk00004 f1  age 30
rk00004 f1  gender  m
rk0001  f1  age 15
rk0001  f1  height  180

RowFilter

def testRowFilter(): Unit ={val comparator = new BinaryComparator(Bytes.toBytes("rk0001"))val filter = new RowFilter(CompareFilter.CompareOp.EQUAL, comparator)val scan = new Scan()scan.setFilter(filter)val table: Table = HbaseUtil.getTable("ns1:students")val scanner: ResultScanner = table.getScanner(scan)printScanner(scanner)}

过滤器列表

比如如果用sql查询

select * where name ="zhaoyun" and sge="25"

这个用Hbase如何实现,Hbase没有sql,然后Hbase一般是依据rowkey来进行查询的.现在要查询字段,如何做?Hbase的API提供了过滤器进行查询. 两个key和value,需要2个列值过滤器联合进行查询猜可以达成结果. 查到符合条件的会把整个rowkey这一行的内容都获取到.

def testFilterList(): Unit = {val list = new FilterList(FilterList.Operator.MUST_PASS_ALL)//单个列的值的二进制比较的构造函数。 如果找到该列并且条件通过,则将输出该行的所有列。 如果条件失败,则不会val filter1 = new SingleColumnValueFilter(Bytes.toBytes("f1"), Bytes.toBytes("name"), CompareOp.EQUAL, Bytes.toBytes("zhaoyun"))val filter2 = new SingleColumnValueFilter(Bytes.toBytes("f1"), Bytes.toBytes("age"), CompareOp.EQUAL, Bytes.toBytes("25"))filter1.setFilterIfMissing(true)filter2.setFilterIfMissing(true)list.addFilter(filter1)list.addFilter(filter2)val scan = new Scan()scan.setFilter(list)val table: Table = HbaseUtil.getTable("ns1:students")val scanner: ResultScanner = table.getScanner(scan)printScanner(scanner)}

运行结果

rk00003  f1  age 25
rk00003 f1  gender  m
rk00003 f1  name    zhaoyun

总结

  • filter就是挽救一下只能通过rowkey来查询的局限,只能通过rowkey查询局限性是很大的
  • 基本上hbase相关的所有字段都可以找到一个filter供过滤查询

Hbase过滤器与scala编程相关推荐

  1. Hbase table CRUD操作及scala编程

    Hbase shell操作 1) 插入数据:put只能插入一个单元格 指定 表名.行键.列名.列值.[时间戳] hbase(main):081:0> put 'ns3:emp','rk0001' ...

  2. Hbase高手之路 -- 第五章 -- HBase的Java API编程

    Hbase高手之路 – 第五章 – HBase的Java API编程 一. 需求与数据集 某自来水公司,需要存储大量的缴费明细数据,以下截取了缴费明细的一部分内容: 因为缴费明细的数据记录非常庞大,该 ...

  3. 大数据Scala编程.问题集(02)

    大数据Scala编程.问题集(02) by 高焕堂 洞庭国际智能硬件检测基地 & 中云大数据中心(IDC) 首席架构师 微博:@高焕堂_台北 Q-02: Scala语言的trait具有什么设计 ...

  4. hbase过滤器查询

    引言:过滤器的类型很多,但是可以分为两大类 比较过滤器 专用过滤器 过滤器的作用是在服务端判断数据是否满足条件,然后只将满足条件的数据返回给客户端: hbase过滤器的比较运算符: LESS < ...

  5. scala编程_Scala编程语言简介

    scala编程 Scala is a programming language that integrates the object oriented and functional language ...

  6. spinal HDL - 01 - 环境搭建与Scala编程指南

    写在前面 SpinalHDL这个语言,我是在了解了香山处理器Chisel才知道的,一直想用一用,SpinalHDL和Chisel师承一脉,都是基于Scala来进行电路描述.其本质上仍旧是HDL而非HL ...

  7. Scala编程——下界介绍与实例分析

    最近又在重温Scala编程.上bilibili网站看了韩顺平老师在尚硅谷的Scala编程语言的教学视频.发现韩老师有关Scala下界的介绍与示例说明,讲解的不是很清晰.并认为可能会给一些学习Scala ...

  8. scala编程_Scala可以带回编程的喜悦吗?

    scala编程 编程不再有趣. 这是开发人员Eric Allman在他最新的博客文章中声称的,他继续抱怨说,如今Java开发人员的许多工作包括单调地将库,集成框架,重构,测试和部署现有代码组成. 埃里 ...

  9. 【图文详细 】Scala——编程练习

    6.Scala 编程练习 6.1.99 乘法表  package com.mazh.scala.funny object Table99 { def main(args: Array[String]) ...

最新文章

  1. AOP 工厂对象之ScopedProxyFactoryBean 原理解析
  2. JavaScript基础3——关于运算符
  3. CodeForces - 346A Alice and Bob(数论+博弈)
  4. 基于FtpClient(JDK1.7)实现Ftp连接
  5. HTTP请求中,几种常见的Content-Type类型
  6. python爬虫要安装什么_python爬虫之分布式爬虫和部署
  7. P4171 [JSOI2010]满汉全席
  8. php 环境优化,[笔记] 使用 opcache 优化生产环境 PHP
  9. 15. JavaScript Array(数组)对象
  10. C语言开定时器做呼吸灯程序,用定时器实现呼吸灯程序
  11. vs2008 sp1补丁安装到最后一点点的时候,就无法安装下去了 解决方法[转]
  12. iframe 嵌入html页面,iframe 完美嵌入网页
  13. React Native-6.React Native Text组件,多组件封装实战之凤凰资讯页面
  14. 华为HarmonyOS 鸿蒙,华为鸿蒙OS系统规划曝光,原来国产自主研发系统已经如此强大...
  15. 线性代数学习笔记——行列式(针对期末与考研)
  16. Linux驱动相关的一些命令
  17. django之十一--开发一个简单的醉得意菜单和人均支付金额查询页面
  18. html qq下高度,怎么知道iframe内容高度
  19. SublimeText4126设置成中文
  20. 史上最全的Waymo自动驾驶出租车体验来了!

热门文章

  1. python json()是什么函数_python 处理 json 四个函数dumps、loads、dump、load的区别
  2. python替换文件中的字符串_Python文件操作中进行字符串替换的方法(保存到新文件/当前文件)...
  3. 卷积神经网络的全连接层转换成卷积层
  4. Python判断字符类型
  5. java画一只小猫程序代码_android 汤姆猫动画源码(主要就是模仿汤姆猫点击小猫给反应)...
  6. vue封装echarts示例
  7. okHttp3连接池简单使用
  8. mysql php 时间比较大小_MySql中时间比较的实现
  9. JavaScript在发送请求AJAX请求时,URL的域名地址是使用绝对地址还是相对地址?
  10. ipad 计算机连接网络设置方法,iPad Air怎么设置上网?苹果平板常用的上网方法图解...