hbase中有没有一种方法可以计算与rowkey搜索匹配的行数

58wvjzkj  于 2021-06-02  发布在  Hadoop
关注(0)|答案(2)|浏览(485)

假设我的rowkey有两个部分(num1~num2)。
我想按行键的第一部分做一个计数组。有没有办法在hbase中做到这一点?
我总是可以把它作为一个m/r作业来执行,读取所有的行、组、计数……但是我想知道是否有一种方法可以在hbase中执行它?

8ehkhllq

8ehkhllq1#

可以在hbase shell中使用regexstringcomparator

hbase(main):003:0> import org.apache.hadoop.hbase.filter.RegexStringComparator
hbase(main):006:0> scan 'test', {FILTER => org.apache.hadoop.hbase.filter.RowFilter.new(CompareFilter::CompareOp.valueOf('EQUAL'),RegexStringComparator.new("NUM1*"))}
yzckvree

yzckvree2#

方案1:

您可以使用前缀筛选器。。。。像下面这样的东西。

前置过滤器:

此筛选器将一个参数作为行键的前缀。它只返回以指定行前缀开头的行中的键值
语法 PrefixFilter (<row_prefix>) java客户机也可以使用同样的方法
使用hbase shell的示例:

scan 'yourtable', {FILTER => "PrefixFilter('12345|abc|50|2016-05-05')"}

scan 'yourtable', {STARTROW=>'12345' FILTER => "PrefixFilter('2016-05-05 08:10:10')"}

根据你的要求。。。
注意:如果您想从java执行,JavaHBase扫描api也有相同的方法

选项2:

fuzzyrowfilter(请参阅hbase的最终版本)这在我们的案例中非常有用,我们使用了诸如map reduce之类的批量客户端以及独立的hbase客户端
此过滤器作用于行键,但方式模糊。它需要一个应该返回的行键列表,以及一个伴随的byte[]数组,该数组表示行键中每个字节的重要性。建造师是这样的:

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

fuzzykeysdata通过采用以下两个值中的一个值来指定所提到的行键字节的重要性:
0表示行键中相同位置的字节必须按原样匹配。1表示相应的行键字节无关紧要,并且始终被接受。

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

行键“????99????\U 01”,其中“?”是任意字符,因为它被忽略。fuzzy data=“\x01\x01\x01\x00\x00\x00\x00\x01\x01\x01\x01\x00\x00\x00”换句话说,fuzzy data数组指示过滤器查找所有与“????99???U 01”匹配的行键,其中“?”将接受任何字符。
这个过滤器的一个优点是,当它到达一个匹配行的末尾时,它可能会计算出下一个匹配行的键。它实现getnextcellhint()方法来帮助服务器快速转发到下一个可能匹配的行范围。这加快了扫描速度,特别是当跳过的范围相当大时。示例4-12使用过滤器从测试数据集中获取特定行。
按列前缀筛选的示例

List<Pair<byte[], byte[]>> keys = new ArrayList<Pair<byte[], byte[]>>();
keys.add(new Pair<byte[], byte[]>(
  Bytes.toBytes("row-?5"), new byte[] { 0, 0, 0, 0, 1, 0 }));
Filter filter = new FuzzyRowFilter(keys);

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结尾的所有行。以上输出证实了正确的结果。

相关问题