假设我的rowkey有两个部分(num1~num2)。我想按行键的第一部分做一个计数组。有没有办法在hbase中做到这一点?我总是可以把它作为一个m/r作业来执行,读取所有的行、组、计数……但是我想知道是否有一种方法可以在hbase中执行它?
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*"))}
yzckvree2#
您可以使用前缀筛选器。。。。像下面这样的东西。
此筛选器将一个参数作为行键的前缀。它只返回以指定行前缀开头的行中的键值语法 PrefixFilter (<row_prefix>) java客户机也可以使用同样的方法使用hbase shell的示例:
PrefixFilter (<row_prefix>)
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也有相同的方法
fuzzyrowfilter(请参阅hbase的最终版本)这在我们的案例中非常有用,我们使用了诸如map reduce之类的批量客户端以及独立的hbase客户端此过滤器作用于行键,但方式模糊。它需要一个应该返回的行键列表,以及一个伴随的byte[]数组,该数组表示行键中每个字节的重要性。建造师是这样的:
FuzzyRowFilter(List<Pair<byte[], byte[]>> fuzzyKeysData)
fuzzykeysdata通过采用以下两个值中的一个值来指定所提到的行键字节的重要性:0表示行键中相同位置的字节必须按原样匹配。1表示相应的行键字节无关紧要,并且始终被接受。
行键“????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结尾的所有行。以上输出证实了正确的结果。
2条答案
按热度按时间8ehkhllq1#
可以在hbase shell中使用regexstringcomparator
yzckvree2#
方案1:
您可以使用前缀筛选器。。。。像下面这样的东西。
前置过滤器:
此筛选器将一个参数作为行键的前缀。它只返回以指定行前缀开头的行中的键值
语法
PrefixFilter (<row_prefix>)
java客户机也可以使用同样的方法使用hbase shell的示例:
根据你的要求。。。
注意:如果您想从java执行,JavaHBase扫描api也有相同的方法
选项2:
fuzzyrowfilter(请参阅hbase的最终版本)这在我们的案例中非常有用,我们使用了诸如map reduce之类的批量客户端以及独立的hbase客户端
此过滤器作用于行键,但方式模糊。它需要一个应该返回的行键列表,以及一个伴随的byte[]数组,该数组表示行键中每个字节的重要性。建造师是这样的:
fuzzykeysdata通过采用以下两个值中的一个值来指定所提到的行键字节的重要性:
0表示行键中相同位置的字节必须按原样匹配。1表示相应的行键字节无关紧要,并且始终被接受。
行键“????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使用过滤器从测试数据集中获取特定行。
按列前缀筛选的示例
示例代码还向扫描中添加了一个过滤列,以保持输出简短:
正在向表中添加行。。。扫描结果:
测试代码连接将向表中添加20行,命名为row-01到row-20。我们要检索与模式行-?5匹配的所有行,换句话说,检索以数字5结尾的所有行。以上输出证实了正确的结果。