第6章 HBase 过滤器的基本使用_第1页
第6章 HBase 过滤器的基本使用_第2页
第6章 HBase 过滤器的基本使用_第3页
第6章 HBase 过滤器的基本使用_第4页
第6章 HBase 过滤器的基本使用_第5页
已阅读5页,还剩19页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

过滤器的基本使用第6章学习目标1.了解Hbase中内置过滤器2.了解布隆过滤器的原理HBaseContents目录过滤器介绍1常见过滤器使用2布隆过滤器36.1

过滤器介绍HBase的基本API,包括增、删、改、查等。增、删都是相对简单的操作,与传统数据库相比,这里的查询操作略显苍白,只能根据指定行键进行查询(Get)或者根据行键的范围来查询(Scan)。HBase不仅提供了这些简单的查询,而且提供了更加高级的过滤器(Filter)来查询。6.1过滤器介绍常见过滤器介绍列值过滤器(valueFilter)根据条件进行全表扫描(每一个cell)。逻辑可能不符合查询需求。单列值过滤器(SingleColumnValueFilter)系统设置好的列值专用过滤器,可以指定一个列进行数据过滤。行键过滤器(RowFilter)针对RowKey进行过滤,效率较高。行键前缀过滤器(PrefixFilter)系统设置好的行键专用过滤器,可以对RowKey进行模糊匹配。效率最高,使用广泛。列值过滤器

//创建二进制比较器,用于过滤器实现过滤规则使用

BinaryComparatorbinaryComparator=newBinaryComparator("23".getBytes());//列值过滤器,GREATER(大于):比较逻辑,过滤出大于23的数据

ValueFiltervalueFilter=newValueFilter(CompareFilter.CompareOp.GREATER,binaryComparator);//对扫描结果使用过滤器

printRSWithFilter(valueFilter);6.2常见过滤器使用6.2常见过滤器使用只要是一行的某个cell满足条件,这一行就会被过滤出来所以结果可能未必是需要的,使用场景比较少单列值过滤器//指定info列族中的的age列,过滤出大于23的数据SingleColumnValueFiltersingleColumnValueFilter=newSingleColumnValueFilter("info".getBytes(),"age".getBytes(),CompareFilter.CompareOp.GREATER,"23".getBytes());printRSWithFilter(singleColumnValueFilter);6.2常见过滤器使用6.2常见过滤器使用针对age这一列进行过滤可以得到正确的结果行键过滤器//创建二进制比较器,用于过滤器实现过滤规则使用BinaryPrefixComparatorbinaryPrefixComparator =newBinaryPrefixComparator("1500100880".getBytes());//过滤出RowKey中,值大于“1500100880”的数据RowFilterrowFilter =newRowFilter(CompareFilter.CompareOp.GREATER,binaryPrefixComparator);printRSWithFilter(rowFilter);6.2常见过滤器使用6.2常见过滤器使用针对rowkey进行过滤效率比对列过滤要高行键前缀过滤器//模糊匹配,过滤出以150010088作为起始RowKey的信息PrefixFilterprefixFilter=newPrefixFilter("150010088".getBytes());printRSWithFilter(prefixFilter);6.2常见过滤器使用6.2常见过滤器使用针对rowkey进行前缀过滤,只能针对前缀进处理,不能做到比较大小等操作,使用范围比行键过滤器小一些但是效率最高组合使用过滤器//过滤出gender为男,age>23,理科班的学生

//第一个过滤器,过滤gande为男SingleColumnValueFilterfilter1=newSingleColumnValueFilter("info".getBytes(),"gender".getBytes(),CompareFilter.CompareOp.EQUAL,"男".getBytes());//第二个过滤器,过滤age>23SingleColumnValueFilterfilter2=newSingleColumnValueFilter("info".getBytes(),"age".getBytes(),CompareFilter.CompareOp.GREATER,"23".getBytes());6.2常见过滤器使用//过滤出clazz包含理科的SingleColumnValueFilterfilter3=newSingleColumnValueFilter("info".getBytes(),"clazz".getBytes(),CompareFilter.CompareOp.EQUAL,newBinaryPrefixComparator("理科".getBytes()));//组合过滤器FilterListfilterList=newFilterList();filterList.addFilter(filter1);filterList.addFilter(filter2);filterList.addFilter(filter3);printRSWithFilter(filterList);6.2常见过滤器使用6.2常见过滤器使用组合后,可以灵活的针对多列进行过滤6.3布隆过滤器

BloomFilter(布隆过滤器)是1970年由布隆提出的。它实际上是一个很长的二进制向量和一系列随机映射函数。布隆过滤器可以用于检索一个元素是否在一个集合中,他可以准确判断出这个元素是否一定不在该集合中。它的优点是空间效率和查询时间都远远超过一般的算法,缺点是有一定的误识别率和删除困难。我们拿个HBase中应用的例子来说下,我们已经知道rowKey存放在哪个region中,为了判断哪个Hfile里面有需要的rowkey,我们就可以通过BloomFilter快速判断,从而过滤掉大部分的HFile,减少需要扫描的Block。6.3布隆过滤器在此简单地介绍一下BloomFilter的工作原理,BloomFilter使用位数组来实现过滤,初始状态下位数组每一位都为0(false),如下图所示:6.3布隆过滤器假如此时有一个集合S={x,y,…},BloomFilter使用n个独立的hash函数,分别将集合中的每一个元素映射到{1,…,m}的范围。对于任何一个元素,被映射到的数字作为对应的位数组的索引,该位会被置为1(true)。下图中集合S有两个元素x和y,分别被3个hash函数进行映射,映射到的位置分别为(0,3,6)和(4,7,10),对应的位会被置为1(true):6.3布隆过滤器现在假如要判断另一个元素是否是在此集合中,只需要被这3个hash函数进行映射,查看对应的位置是否有0(false)存在,如果有的话,表示此元素肯定不存在于这个集合,否则有可能存在。下图所示就表示z肯定不在集合{x,y}中:布隆过滤器的代码简单实现(部分重要代码,完整代码在试验手册)privateintsize;//大小(位数组长度),数组越长占用越多,越准确

privateBitSetbitSet;//生成二进位数组

privateinthashFunctions;//哈希函数个数,多次计算hash值,可以提高准确率

//添加元素

publicvoidadd(Stringelement){//根据哈希函数个数循环多次计算

for(inti=0;i<hashFunctions;i++){//带上次数计算hash值

inthash=hash(element,i);//将二进制位数组的值改为truebitSet.set(hash,true);}}6.3布隆过滤器//哈希函数

privateinthash(Stringelement,intseed){inthash=0;//加上次数计算哈希值

for(inti=0;i<element.length();i++){hash=seed*hash+element.charAt(i);}returnMath.abs(hash)%size;}6.3布隆过滤器//查询元素是否可能存在于集合中

publicStringcontains(Stringelement){for(inti=0;i<hashFunctions;i++){//带上计算hash值

inthash=hash(element,i);//如果匹配失败,位数据对不上,说明不在

if(!bitSet.get(hash)){return"数"+element+"据不在此处";}}//否则就是可能存在

return"数据"+element+"可能在此处";}

//初始化布隆过滤器

simpleBloomFilterbloomFilter=newsimpleBloomFilter(8,3);//插入几条数据

bloomFilter.add("apple");bloomFilter.add("orange");bloomFilter.add("banana");bloomFilter.add("grape");//打印结果

System.out.println(bloomFilter.contains("apple"));//可能在此处

System.out.println(bloomFilter.c

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论