gpt4 book ai didi

hadoop - HBase 中有没有一种方法可以计算匹配 rowkey-search 的行

转载 作者:可可西里 更新时间:2023-11-01 14:48:32 30 4
gpt4 key购买 nike

假设我的 Rowkey 有两部分 (NUM1~NUM2)。

我想按 Rowkey 的第一部分做一个计数组。有没有办法在 HBase 中执行此操作?

我总是可以将其作为 M/R 作业读取所有行、组、计数...但我想知道是否有一种方法可以在 HBase 中执行此操作?

最佳答案

选项 1:

你可以使用prefix filter. ... 类似下面的内容。

前缀过滤器:

This filter takes one argument a prefix of a row key. It returns only those key-values present in a row that starts with the specified row prefix

Syntax

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 hbase scan api 也有相同的方法,如果你想从 java 做的话

选项2:

FuzzyRowFilter(see hbase-the-definitive) This is really useful in our case We have used bulk clients like map-reduce as well as standalone hbase clients

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

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

fuzzyKeysData 通过采用以下两个值之一来指定行键字节的重要性:

0 Indicates that the byte at the same position in the row key must match as-is. 1 Means that the corresponding row key byte does not matter and is always accepted.

* 示例:部分行键匹配 *一个可能的例子是匹配部分键,但不是从左到右,而是在复合键内的某个地方。假设行键格式为 _,具有固定长度的部分,其中 is 4,is 2,is 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 使用过滤器从测试数据集中抓取特定行。

按列前缀过滤的示例

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。我们想要检索与模式 row-?5 匹配的所有行,换句话说,所有以数字 5 结尾的行。上面的输出确认了正确的结果。

关于hadoop - HBase 中有没有一种方法可以计算匹配 rowkey-search 的行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41862640/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com