Hbase过滤器与scala编程
什么是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编程相关推荐
- Hbase table CRUD操作及scala编程
Hbase shell操作 1) 插入数据:put只能插入一个单元格 指定 表名.行键.列名.列值.[时间戳] hbase(main):081:0> put 'ns3:emp','rk0001' ...
- Hbase高手之路 -- 第五章 -- HBase的Java API编程
Hbase高手之路 – 第五章 – HBase的Java API编程 一. 需求与数据集 某自来水公司,需要存储大量的缴费明细数据,以下截取了缴费明细的一部分内容: 因为缴费明细的数据记录非常庞大,该 ...
- 大数据Scala编程.问题集(02)
大数据Scala编程.问题集(02) by 高焕堂 洞庭国际智能硬件检测基地 & 中云大数据中心(IDC) 首席架构师 微博:@高焕堂_台北 Q-02: Scala语言的trait具有什么设计 ...
- hbase过滤器查询
引言:过滤器的类型很多,但是可以分为两大类 比较过滤器 专用过滤器 过滤器的作用是在服务端判断数据是否满足条件,然后只将满足条件的数据返回给客户端: hbase过滤器的比较运算符: LESS < ...
- scala编程_Scala编程语言简介
scala编程 Scala is a programming language that integrates the object oriented and functional language ...
- spinal HDL - 01 - 环境搭建与Scala编程指南
写在前面 SpinalHDL这个语言,我是在了解了香山处理器Chisel才知道的,一直想用一用,SpinalHDL和Chisel师承一脉,都是基于Scala来进行电路描述.其本质上仍旧是HDL而非HL ...
- Scala编程——下界介绍与实例分析
最近又在重温Scala编程.上bilibili网站看了韩顺平老师在尚硅谷的Scala编程语言的教学视频.发现韩老师有关Scala下界的介绍与示例说明,讲解的不是很清晰.并认为可能会给一些学习Scala ...
- scala编程_Scala可以带回编程的喜悦吗?
scala编程 编程不再有趣. 这是开发人员Eric Allman在他最新的博客文章中声称的,他继续抱怨说,如今Java开发人员的许多工作包括单调地将库,集成框架,重构,测试和部署现有代码组成. 埃里 ...
- 【图文详细 】Scala——编程练习
6.Scala 编程练习 6.1.99 乘法表 package com.mazh.scala.funny object Table99 { def main(args: Array[String]) ...
最新文章
- AOP 工厂对象之ScopedProxyFactoryBean 原理解析
- JavaScript基础3——关于运算符
- CodeForces - 346A Alice and Bob(数论+博弈)
- 基于FtpClient(JDK1.7)实现Ftp连接
- HTTP请求中,几种常见的Content-Type类型
- python爬虫要安装什么_python爬虫之分布式爬虫和部署
- P4171 [JSOI2010]满汉全席
- php 环境优化,[笔记] 使用 opcache 优化生产环境 PHP
- 15. JavaScript Array(数组)对象
- C语言开定时器做呼吸灯程序,用定时器实现呼吸灯程序
- vs2008 sp1补丁安装到最后一点点的时候,就无法安装下去了 解决方法[转]
- iframe 嵌入html页面,iframe 完美嵌入网页
- React Native-6.React Native Text组件,多组件封装实战之凤凰资讯页面
- 华为HarmonyOS 鸿蒙,华为鸿蒙OS系统规划曝光,原来国产自主研发系统已经如此强大...
- 线性代数学习笔记——行列式(针对期末与考研)
- Linux驱动相关的一些命令
- django之十一--开发一个简单的醉得意菜单和人均支付金额查询页面
- html qq下高度,怎么知道iframe内容高度
- SublimeText4126设置成中文
- 史上最全的Waymo自动驾驶出租车体验来了!
热门文章
- python json()是什么函数_python 处理 json 四个函数dumps、loads、dump、load的区别
- python替换文件中的字符串_Python文件操作中进行字符串替换的方法(保存到新文件/当前文件)...
- 卷积神经网络的全连接层转换成卷积层
- Python判断字符类型
- java画一只小猫程序代码_android 汤姆猫动画源码(主要就是模仿汤姆猫点击小猫给反应)...
- vue封装echarts示例
- okHttp3连接池简单使用
- mysql php 时间比较大小_MySql中时间比较的实现
- JavaScript在发送请求AJAX请求时,URL的域名地址是使用绝对地址还是相对地址?
- ipad 计算机连接网络设置方法,iPad Air怎么设置上网?苹果平板常用的上网方法图解...