如何在Hbase中获取特定行?

时间:2019-02-19 13:21:10

标签: hadoop nosql hbase

我在HBase中的rowKey像这样;

[...]
<xsd:import namespace="http://test.com/ebo/Basic" schemaLocation="../../mds/ebo/Bsc.xsd"/>
<xsd:import namespace="http://test.com/ebo/header" schemaLocation="../../mds/ebo/header.xsd"/>
<xsd:import namespace="http://test.com/ebo/cpr" schemaLocation="../../mds/ebo/cpr.xsd"/>
[...]

我只想获取这些数据;

a1s1
a1s2
a1s3
a2s1
a3s1
a3s2
...

但是当我运行这个查询时; 扫描't1',{STARTROW =>'a1s1',ENDROW =>'a4s1'}

它给了我

a1s1
a2s1
a3s1

但是我不想得到 a1s2和a1s3 。我该怎么办?

2 个答案:

答案 0 :(得分:1)

您应该将STARTROW-ENDROW和另一个过滤器与RegexStringComparator一起使用。如果仅使用开始-结束行过滤器,则hbase会对行键中的每个字符执行此过滤。因为rowkey不是数字。在Hbase Shell中,您可以尝试以下操作:

import org.apache.hadoop.hbase.filter.CompareFilter

import org.apache.hadoop.hbase.filter.RegexStringComparator

scan 't1', {STARTROW => 'a1s1', ENDROW => 'a4s1', FILTER => org.apache.hadoop.hbase.filter.RowFilter.new(CompareFilter::CompareOp.valueOf('EQUAL'),RegexStringComparator.new("s1$"))}

答案 1 :(得分:0)

我假设,您想获取以“ a *”开头并以“ s1”结尾的行键。

因此您可以在下面使用:

 scan 't1', { ENDROW=>'s1'}

scan 't1', {STARTROW=>'a', ENDROW=>'s1'}

另一个选择是使用regexString:

scan 't1', {FILTER => "RowFilter(=, 'regexstring:*s1')"}