Hbase API高级特性-专用过滤器

原创 2013年12月01日 22:01:54

1.   Hbase提供的专用过滤器直接继承自FilterBase,其中一些过滤器只能做行筛选,因此只适合于扫描操作,对get(),这些过滤器限制的更苛刻:要么包含整行,要么什么都不包括。

2.   单列值过滤器(SingleColumnValueFilter)

用一列的值决定是否一行数据被过滤。

public void singleColumnValueFilter() throws IOException{
SingleColumnValueFilter filter = new SingleColumnValueFilter(Bytes.toBytes("info"), 
Bytes.toBytes("name"), CompareFilter.CompareOp.LESS_OR_EQUAL, 
new BinaryComparator(Bytes.toBytes("ljj")));
filter.setFilterIfMissing(true); //所有不包含参考列的行都可以被过滤掉,默认这一行包含在结果中

Scan scan = new Scan();
scan.setFilter(filter);
ResultScanner scanner  = table.getScanner(scan);
for(Result res:scanner){
for(KeyValue kv: res.raw()){
System.out.println("KV: "+kv + ",value: "+Bytes.toString(kv.getValue()));
}
}
scanner.close();

Get get = new Get(Bytes.toBytes("3103"));
get.setFilter(filter);
Result result = table.get(get);
System.out.println("Result of get(): " + result);
for(KeyValue kv:result.raw()){
System.out.println("KV: "+kv + ",value: "+Bytes.toString(kv.getValue()));
}
}

3.   单列排除过滤器(SingleColumnValueExcludeFilter)

该过滤器继承SingleColumnValueFilter,参考列不会包含在结果中。

4.   前缀过滤器(PrefixFilter)

所用与前缀匹配的行都会被返回。扫描操作以字典序查找,当遇到比前缀大的行时,扫描结束。此过滤器对get()方法作用不大。

public void prefixFilter() throws IOException{
Filter filter = new PrefixFilter(Bytes.toBytes("31"));

Scan scan = new Scan();
scan.setFilter(filter);
ResultScanner scanner = table.getScanner(scan);
for(Result res:scanner){
for(KeyValue kv: res.raw()){
System.out.println("KV: "+kv + ",value: "+Bytes.toString(kv.getValue()));
}
}
scanner.close();
//此过滤器对get()方法作用不大
}

5.   分页过滤器(PageFilter)

作用:对结果按行分页。

public void pageFilter() throws IOException{
Filter filter = new PageFilter(4);
int totalRows = 0;
byte[] lastRow = null;
byte[] POSTFIX = new byte[0];
while(true){
Scan scan = new Scan();
scan.setFilter(filter);
if(lastRow != null){
byte[] startRow = Bytes.add(lastRow, POSTFIX);
System.out.println("start row: "+Bytes.toString(startRow));
scan.setStartRow(startRow);
}
ResultScanner scanner = table.getScanner(scan);
int localRows = 0;
Result result;
while((result = scanner.next()) != null){
System.out.println(localRows++ +": "+result);
totalRows++;
lastRow = result.getRow();
}
scanner.close();
if(localRows == 0)
break;
}
System.out.println("total rows: "+ totalRows);
}

6.   行键过滤器(KeyOnlyFilter)

只需要将结果中KeyValue实例的键返回,不需要返回实际的数据。

7.首次行键过滤器(FirstKeyOnlyFilter)

只需要访问一行中的第一列。该过滤器常用在行数统计。

8.包含结束的过滤器(InclusiveStopFilter)

开始行被包含在结果中,但终止行被排斥在外,使用这个过滤器,也可以将结束行包含在结果中。

public void inclusiveStopFilter() throws IOException{
Filter filter = new InclusiveStopFilter(Bytes.toBytes("3104"));
Scan scan = new Scan();
scan.setStartRow(Bytes.toBytes("3101"));
scan.setFilter(filter);
ResultScanner scanner = table.getScanner(scan);
for(Result res: scanner){
System.out.println(res);
}
}

9.时间戳过滤器(TimestampsFilter)

      需要在扫描结果中对版本进行细粒度控制。

一个版本是指一个列在一个特定时间的值。

public void timestampsFilter() throws IOException{
List<Long> ts = new ArrayList<Long>();
ts.add(new Long(5));
ts.add(new Long(10));
ts.add(new Long(15));
Filter filter = new TimestampsFilter(ts);

Scan scan = new Scan();
scan.setFilter(filter);
ResultScanner scanner = table.getScanner(scan);
for(Result res:scanner){
System.out.println(res);
}
scanner.close();

Scan scan2 = new Scan();
scan2.setFilter(filter);
scan2.setTimeRange(8, 12);
ResultScanner scanner2 = table.getScanner(scan2);
for(Result res:scanner2)
System.out.println(res);
scanner2.close();
}

10.列计数过滤器(ColumnCountGetFilter)

      限制每行最多取回多少列。设置ColumnCountGetFilter(int n),它不适合扫描操作,更适合get()。

11.列分页过滤器(ColumnPaginationFilter)

     可以对一行中所有列进行分页。

ColumnPaginationFilter(int limit,int offset),跳过所有偏移量小于offset的列,并包含之前所有偏移量在limit之前的列。

public void columnPaginationFilter() throws IOException{
Filter filter = new ColumnPaginationFilter(2,3);

Scan scan = new Scan();
scan.setFilter(filter);
ResultScanner  scanner = table.getScanner(scan);
for(Result res:scanner)
System.out.println(res);
scanner.close();
}

12.列前缀过滤器(ColumnPrefixFilter)

      对列名称前缀进行匹配。

13.随机行过滤器(RandomRowFilter)

      可以让结果中包含随机行。RandomRowFilter(float chance)

Chance在0~1之间。

hbase权威指南阅读随手笔记二之过滤器

base过滤器的比较操作符: LESS   LESS_OR_EQUAL EQUAL = NOT_EQUAL GREATER_OR_EQUAL >= GREATER > ...

使用MapReduce处理Hbase数据

使用MapReduce处理Hbase数据   今天终于把MR处理Hbase的数据的程序搞定了,自己走了好多的弯路,程序写完之后,在本机的伪分布式的hadoop上跑是没问题的,可是把程序上传的...

Hbase API高级特性-比较过滤器

1.   过滤器在客户端创建,通过RPC传送到服务器端,然后再服务器端执行过滤操作。 2.   行过滤器(RowFilter) public void rowFilterScan() throws I...

Hbase API高级特性-计数器

1.  许多收集统计信息的应用有点击流或在线广告意见,这些应用需要收集到日志文件用作后续的分析,用户可以使用计数器做实时统计,从而放弃延时较高的批量处理操作。 2.  原子操作检查并修改:将当前列当...

HBase读书笔记之API高级特性-4

HBase读书笔记之API高级特性-4
  • caixen
  • caixen
  • 2016年01月09日 12:13
  • 156

HBase查询(2)---Dedicated Filters专用过滤器

2.1 SingleColumnValueFilter 选定列簇和某一列,然后与列的value相比,正确的返回全部的row,注意如果某一行不含有该列,同样返回,除非通过filterIfColumnMi...

HBase总结(7)--专用过滤器

一、介绍 除了上述介绍的比较过滤器以外,hbase还提供了许多专门用于一些特殊场景的过滤器,这样的过滤器叫做专用过滤器 二、例子 1、单列值过滤器:SingleColumnValueFilter...

HBase概念学习(四)Java API之扫描和过滤器

HBase基本的CRUD操作就不多介绍了,无非就是Put,Get,Delete三个类的运用。 现在看一下扫描技术,这种技术类似于关系型数据库的游标(cursor),并利用到了HBase底层顺序存储的特...

Hbase葱岭探秘--过滤器Api

Hbase中提供了许多的过滤器接口,以此来对数据进行过滤,使得查询出想要的数据。行过滤器针对行信息进行过滤,参数中可以采用前缀匹配、按位与、或、异或以及子串匹配等匹配的方式。同时可以控制EQUAL、N...

Java Web高级特性之(一)过滤器

过滤器的概念 过滤器是一个服务器端的组件,它可以截取用户端的请求与响应信息,并对这些信息过滤。 过滤器的工作原理 过滤器的生命周期 过滤器的API 多个过滤器下的应用 过滤器的分类 S...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Hbase API高级特性-专用过滤器
举报原因:
原因补充:

(最多只允许输入30个字)