如何使用pageFilter避免扫描对象中的某些行?

时间:2016-07-30 05:47:50

标签: java hadoop hbase

我是Hbase的新手,我在HBase中使用PageFilter来扫描1000条记录,而在迭代扫描对象时,我希望根据rowkey(我将拥有的rowkey)排除某些行,并且然后想要在该扫描对象上应用一个pagefilter,通过排除我不需要的行来读取1000条记录。这是可以实现的吗? 请让我知道如何实现这一目标,非常感谢。谢谢......

1 个答案:

答案 0 :(得分:1)

您无法通过Page Filter实现此目的。 它应该是组合可以像模糊行过滤器+页面过滤器 作为要传递给扫描对象的过滤器列表。

  

FuzzyRowFilter(see hbase-the-definitive) This is really useful in our case   其中描述如下......

FuzzyRowFilter 此过滤器作用于行键,但以模糊方式。它需要一个应该返回的行键列表,以及一个附带的byte []数组,它表示行键中每个字节的重要性。构造函数是这样的:

FuzzyRowFilter(List<Pair<byte[], byte[]>> fuzzyKeysData)

fuzzyKeysData通过取两个值中的一个来指定行键字节的上述重要性:

  

0表示行键中相同位置的字节必须   按原样匹配。 1表示相应的行键字节没有   事情并且总是被接受。

     

示例:部分行匹配可能的示例是匹配部分键,但不是从左到右,而是在内部的某个位置   复合键。假设行键格式为    _,具有固定长度的部分,其中    是4,是2,是4,是2个字节   长。该应用程序现在请求执行确定的所有用户   任何一年的1月份的行动(编码为99)。然后一对换行   关键和模糊数据如下:

     

行键“???? 99 ???? _ 01”,其中“?”是一个任意的角色,   因为它被忽略了。模糊数据   =“\ x01 \ x01 \ x01 \ x01 \ x00 \ x00 \ x00 \ x00 \ x01 \ x01 \ x01 \ x01 \ x00 \ x00 \ x00”换句话说,模糊数据数组指示过滤器查找所有行   键匹配“???? 99 ???? _ 01”,其中“?”会接受任何   字符。

此过滤器的一个优点是它可能在匹配的行结束时计算下一个匹配的行键。它实现了getNextCellHint()方法,以帮助服务器快速转发到可能匹配的下一行范围。这加快了扫描速度,特别是当跳过的范围非常大时。示例4-12使用过滤器从测试数据集中获取特定行。

例4-12。按列前缀过滤的示例     列表&gt; keys = new ArrayList&gt;();     keys.add(新对(       Bytes.toBytes(“row-?5”),new byte [] {0,0,0,0,1,0}));     过滤器过滤器=新的FuzzyRowFilter(键);

Scan scan = new Scan()
  .addColumn(Bytes.toBytes("colfam1"), Bytes.toBytes("col-5"))
  .setFilter(filter);
ResultScanner scanner = table.getScanner(scan);
for (Result result : scanner) {
  System.out.println(result);
}
scanner.close();

示例代码还为扫描添加了一个过滤列,只是为了保持输出简短:

向表中添加行... 扫描结果:

keyvalues={row-05/colfam1:col-01/1/Put/vlen=9/seqid=0,
           row-05/colfam1:col-02/2/Put/vlen=9/seqid=0,
           ...
           row-05/colfam1:col-09/9/Put/vlen=9/seqid=0,
           row-05/colfam1:col-10/10/Put/vlen=9/seqid=0}
keyvalues={row-15/colfam1:col-01/1/Put/vlen=9/seqid=0,
           row-15/colfam1:col-02/2/Put/vlen=9/seqid=0,
           ...
           row-15/colfam1:col-09/9/Put/vlen=9/seqid=0,
           row-15/colfam1:col-10/10/Put/vlen=9/seqid=0}

测试代码布线在表中添加了20行,名为row-01到row-20。我们想要检索与模式行匹配的所有行 - ?5,换句话说,所有以数字5结尾的行。上面的输出确认了正确的结果

另一种方法

您还可以查看RowFilter +页面过滤器。 见Example 4-1. Example using a filter to select specific rows

注意:您可以选择适合自己的