2012-04-23 60 views
2

我有一个行键模式像20110103 ---这样的行键将像20110103-1-23-333。HBase行键和范围扫描

当我做使用例如扫描范围查询, STARTROW - > 20110103-1-23- endRow - > 20110105-1-23-

我得到不属于上述范围内的行以及。例如,我也得到20110105-1-15-6666行。我也得到了与商店15相关的行。

我该如何解决这个问题?请问对这个问题.... RegularExpressionFilter解决这个....

请咨询

回答

7

你列出的三个行键:

20110103-1-23- 
20110105-1-15-666 
20110105-1-23- 

看起来像自然排序顺序给我;以“20110103”开头的那个确实出现在“666”结尾。 (有一点混淆可能是HBase,这些都只是字节,而字典式排序一次只能完成一个字节;所以,“aaa”会排在“aa”之后但排在“ab”之前。 )

0

行20110105-1-15-6666正确在范围[20110103-1-23-,20110105-1-23-)中,因为15小于23,并且行的排序是词典。

您提到“我也获得了与商店15相关的行”,这让我想象行密钥中的第三个数字(________-_-23-)是该行的某种属性。

我建议改变这个表的模式,使这个“门店数量”一栏,让你的钥匙能像20110103-1和列“存储”你有这些数字1523或什么的。

这样,在扫描中,可以过滤掉列存储= 15的行。

如果您使用的是Java API,这看起来像:

SingleColumnValueFilter filter = new SingleColumnValueFilter(
    Bytes.toBytes("columnfamily"), 
    Bytes.toBytes("storenumber"), 
    CompareFilter.CompareOp.NOT_EQUAL, 
    Bytes.toBytes(15) 
); 
filter.setFilterIfMissing(true); 
Scan scan = new Scan(
    Bytes.toBytes("20110103-1"), 
    Bytes.toBytes("20110105-1") 
); 
scan.setFilter(filter); 

你可能会在该行密钥存储太多的数据,尽量采取一些这些属性的行键,使他们是一个专栏。另外请记住,您也可以使用日期(我假设20110105是日期)作为时间戳(表格的单元格)而不是行键。这取决于你的应用程序。

1

,你可以打开HBase的外壳发出以下命令

scan 'YourHbaseTableName',{FILTER=>"(RowFilter(=,'regexstring:20110103'))"} 
0

假设的HBase作为一个字节多个嵌套有序图。 因此,您需要将时间戳保存在二进制演示文稿中,以便在每个查询中获得正确的顺序。

我想您保存rowkey值的字符串数据类型,例如使用Java方法:

yourDateString.getBytes(encoding) 

Bytes.toBytes(yourDateString) 

通过HBase的API添加。

我的建议是将时间值保存为时间戳(长)。 这一长串应该被序列化为字节,然后保存在rowkey中。 请注意,由于不断上升的特性,在rowkey中保存时间戳有点问题。时间戳每毫秒会变大,因此每个新值都将保存到管理此区域的HBase区域。简而言之,您只需写入其中一个群集机器,这不是使用HBase群集的目标。 对于大小为100 machnies的群集,您可以使用salting(在rowkey前面放置一个随机数,以将所有值分配到整个群集中)。 查看phoenix项目。 它为你做所有的translating,salting等,提供简单的SQL语句。