HBase中的过滤器

来源:互联网 发布:阿里云dns解析地址 编辑:程序博客网 时间:2024/05/26 17:47

熟悉mysql,oracl,sqlserver的朋友,对过滤器肯定不会陌生,可以对内容进行正则表达式的匹配等.而Hbase中的过滤器是于数据读取类get和scan来结合适用,用于更细粒度的获取数据

 一.Hbase中的过滤器的类继承层次结构

    在过滤器最底层的是Filter接口和FilteBase类,还有一类特殊的过滤器继承自CompareFilter

    先来说明下继承自CompareFilter的过滤器的几种类型

    继承CompareFilter的过滤器比继承FilterBase的过滤器多了compare方法,所以在使用compareFilter过滤器的时候,至 少需要传入两个参数,比较操作符和比较器

   1.比较过滤器类型:

  (1) 行过滤器 RowFilter 根据传入的比较运算符和比较器来比较行键

  (2)列族过滤器,FamilyFilter,使用也非常简单,跟RowFilter不一样的是,比较的是列族而不是行键了

  (3)列名过滤器 QualifierFilter 筛选特定的列

  (4)值过滤器 ValueFilter ,这个过滤器功能还是很强大的,可以过滤出特定单元格的值,不想mysql或者oracle中过滤所有的列中包含某个值的时候会很麻烦,可以需要写所有的的列like 某个值,而在HBase中简单的定义一个值过滤器,就可以遍历所有的列,把只要有一列包含该值的行都能查找出来,该过滤器与RegexStringComparator使用功能更强大,就像mysql中的like 

 (5) 参考列过滤器

     这里有一种更复杂的过滤器,这种过滤器不像上面的过滤器那样,简单的通过用户指定的信息筛选数据,这种过滤器允许用户指定一个参考列或是引用列,并使用参考列控制其他列的过滤.所谓的参考是参考参考列的时间戳,并在过滤时包含与引用时间戳相同的列

2.专用过滤器:

此类过滤器直接继承自FilterBase;

(1)单列值过滤器 SingleColumnValueFilter :看名字与ValueFilter可以这么来理解区别,该过滤器是用一列的数据来过滤掉一整行,也就是如果设置的某列的值不符合提供的值的话,该行会整个的被过滤掉

(2)前缀过滤器:是配置行键的前缀是提供的值

(3)分页过滤器 使用分页过滤器时,需要注意的是startrow和stoprow的确定,在一次分页完成后,需要客户端自己记录下startrow

(4)行键过滤器 KeyOnlyFilter,意思是将Keyvalue中的key和数值做处理,该处理器默认处理是只返回keyvalue实例的key,而不返回数值,不过该设置可以通过设置converttokeyonly来改变

(5)首次行键过滤器 FirstKeyOnlyFilter  这个过滤器是只访问一行中的第一列,而在HBase中列也是根据字典顺序进行排序的,所以会访问字典顺序排序的第一列,该类过滤器在统计行数的应用中会经常用,而且效率会高,因为Hbase中访问完第一列后,扫描器就结束了对该行的扫描

(6)包含结束的过滤器:InclusiveStopFilter,所谓的包含结束是只包含stoprow,扫描器的返回结果是包含startrow,而不包含stoprow的使用该过滤器是替代scan.setstoprow,可以达到将stoprow也包含在结果中的目的.

(7)时间戳过滤器 TimeStampFilter: 也是只扫描传入的时间戳的列值

(8)列计数过滤器 ColumnCounGetFilter:用户可以使用这个过滤器来限制每行最多取回多少列,当一行的列数达到设定的最大值时,这个过滤器会停止整个扫描操作,所以它不太适合扫描操作,反而比较适合get操作,这个叫做列返回数过滤器更恰当.

(9)列分页过滤器:ColumnPaginationFilter:对一行的所有列进行分页,它有两个构造参数 ColumnPaginationFilter(int limit,int offset) --offset的意思是是从此处的列偏移量开始返回, limit的意思是返回列偏移量之后几列 

如果有多个列族的时候,偏移量是统一计算的,也就是先按列族排序,再按列族中的列进行排序,然后计算偏移量的.

(10)列前缀过滤器ColumnPrefixFilter:跟PrefixFilter过滤器一样,需要指定一个列前缀的参数,所有符合列前缀的列都被包含在结果中

3.附加过滤器,该类过滤器不依赖于过滤器本身,却可以应用在其他过滤器上,对过滤器进行控制.

  (1)跳转过滤器 Skipfilter:可以这么来理解该类过滤器,是对上面过滤器的一种封装,所以skipfilter的构造参数是某个filter

    跳转过滤器 :当被包装的过滤器遇到一个需要过滤的keyvalue实例时,用户可以拓展并过滤整行数据,换句话说,当过滤器发现某一行中的一列需要过滤时,那么整行数据都将被过滤,所以被SkipFilter包装的过滤器必须实现了filterKeyvalue方法,否则skipfilter无法正常工作.举例说明:valufilter是过滤keyvalue,并且也实现了filterkeyvalue方法,如果某行中的某些列不符合valuefilter的筛选,另外一写列符合valuefilter的筛选,如果只使用valuefilter的话,该行数据还是在筛选结果中,并且只返回那些符合条件的列,但是如果用skipfilter包装了valuefilter的话,那么该行数据就直接不会返回了,直接被skip了,要是这么理解的话,是不是跟singlecolumnvaluefilter是一样的效果呀????

(2)全匹配过滤器 WhileMatchFilter:该过滤器的特殊之处是,当某条数据被过滤掉后,就直接结束此次扫描,只返回扫描结束前数据.

例如上面的结果,使用了whilematchfilter来包装了rowfilter,rowfilter是查询不等于row-05的数据,第一个结果是只使用了rowfilter的效果,只是过滤了不等于row-05的数据,而第二个结果使用了whilematchfilter匹配了rowfilter之后,等过滤掉row-05后,就直接结束了该次扫描.所以只返回了row-01到row-04的数据,之后的数据就不再返回了.


4.FilterList: 这个类的功能是组合几个过滤器的功能,如果想对某次扫描,使用多个过滤器的过滤功能,那么filterlist就发挥作用了. 该类的构造函数有FileterList(Operator,List<Filter>) Operator的值就只有两个MUST_PASS_ALL和MUST_PASS_ONE,MUST_PASS_ALL是必须所有的过滤器全部符合,MUST_PASS_ONE,是只要符合其中一个过滤器就可以.

0 0
原创粉丝点击