让我们说我的Rowkey有两个部分(NUM1~NUM2)。
我想在Rowkey的第一部分做一个计数组。有没有办法在HBase中做到这一点?
我可以随时将其作为M / R作业读取所有行,组,计数......但我想知道是否有办法在HBase中执行此操作?
答案 0 :(得分:2)
你可以使用prefix filter. ......下面的内容。
此过滤器将一个参数作为行键的前缀。它只返回 那些以指定行开头的行中存在的键值 前缀
语法
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
执行此操作,java hbase scan api也有相同的方法FuzzyRowFilter(see hbase-the-definitive) This is really useful in our case 我们使用了map-reduce等大容量客户端以及独立的hbase客户端
此过滤器作用于行键,但模糊方式。它需要一个应该返回的行键列表,以及一个附带的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使用过滤器从测试数据集中获取特定行。
按列前缀
进行过滤的示例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结尾的行。上面的输出确认了正确的结果。
答案 1 :(得分:0)
您可以在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*"))}