我有一个Hbase表,我的行键看起来像下面提到的
12345678912:::timestamp:::1234567891:::john cf:somedata
12345678912:::timestamp:::1234567891:::smith cf:somedata
12345678912:::timestamp:::1234567891:::lotta cf:somedata现在,我想使用行键regex过滤出一些行,如下所述
scan 'mytable', {STARTROW=>'.*:::starttimestamp:::.*:::john', STOPROW=>'.*:::endtimestamp:::.*:::john'}但这似乎也不起作用,我通过一些研究了解到我们不能在rowkey中使用regex。
如何在hbase shell中使用FuzzyRowFilter进行此操作?这个过滤器对我的情况真的有帮助吗?
我知道我可以对特定的行使用SingleColumnValue过滤器,但是我的行键在这里对我也很重要。
发布于 2015-10-28 23:39:40
您的要求是对行键进行范围扫描。看起来,范围适用于整个字符串。例如,下面的代码是有效的。
scan 'scanRangeTest',{STARTROW=>'1234|20-10-2014|john', STOPROW=>'1234|24-10-2014|john'}您将获得john在两个时间戳之间的所有记录。这里要指出的是,您应该构建启动和停止参数。
有一个正则表达式比较器。您可以将其与RowKey过滤器一起使用。请参阅here。然而,当您以这种方式使用正则表达式时,您将获得所有匹配的记录,但它不会给您提供范围选项,这可能对您很重要。
上面“使用正则表达式比较器的行过滤器”的替代方案是二级索引和FuzzyRowFilter。它们通过跳过某些记录来帮助获得更快的扫描速度。但是,range选项仍然不存在。因此,您可以根据自己的需求接听电话。
问题的解决方案
获取特定用户名(John)的日期范围和一些id(12345678912,1234567891)。在我的scan命令中,range只适用于完整的行键,而不适用于regex。因此,只要你有名称和id是公共的(你可以像往常一样获得这个参数),然后只改变时间戳(你可以根据你的要求添加这个),并且使用所有这三个,你构建整个行键,然后你可以使用start和stop row。我希望我已经清楚了你的要求。
create 'scanRangeTest', {NAME => 'srt', REPLICATION_SCOPE => '1'}
put 'scanRangeTest','1234|20-10-2014|john', 'srt:name','John Details'
put 'scanRangeTest','1235|21-10-2014|smita', 'srt:name','Smita Details'
put 'scanRangeTest','1236|22-10-2014|lotta', 'srt:name','Lotta Details'
put 'scanRangeTest','1234|23-10-2014|john', 'srt:name','John Details sec timestamp'
put 'scanRangeTest','1237|23-10-2014|john', 'srt:name','Ram Details'
scan 'scanRangeTest',{STARTROW=>'1234|20-10-2014|john', STOPROW=>'1234|24-10-2014|john'}
Output
ROW COLUMN+CELL
1234|20-10-2014|john column=srt:name, timestamp=1446045032763, value=John Details
1234|23-10-2014|john column=srt:name, timestamp=1446045054544, value=John Details sec timestamphttps://stackoverflow.com/questions/33360937
复制相似问题