我在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 。我该怎么办?
答案 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')"}