我有一个行键模式像20110103 ---这样的行键将像20110103-1-23-333。HBase行键和范围扫描
当我做使用例如扫描范围查询, STARTROW - > 20110103-1-23- endRow - > 20110105-1-23-
我得到不属于上述范围内的行以及。例如,我也得到20110105-1-15-6666行。我也得到了与商店15相关的行。
我该如何解决这个问题?请问对这个问题.... RegularExpressionFilter解决这个....
请咨询
我有一个行键模式像20110103 ---这样的行键将像20110103-1-23-333。HBase行键和范围扫描
当我做使用例如扫描范围查询, STARTROW - > 20110103-1-23- endRow - > 20110105-1-23-
我得到不属于上述范围内的行以及。例如,我也得到20110105-1-15-6666行。我也得到了与商店15相关的行。
我该如何解决这个问题?请问对这个问题.... RegularExpressionFilter解决这个....
请咨询
你列出的三个行键:
20110103-1-23-
20110105-1-15-666
20110105-1-23-
看起来像自然排序顺序给我;以“20110103”开头的那个确实出现在“666”结尾。 (有一点混淆可能是HBase,这些都只是字节,而字典式排序一次只能完成一个字节;所以,“aaa”会排在“aa”之后但排在“ab”之前。 )
行20110105-1-15-6666正确在范围[20110103-1-23-,20110105-1-23-)中,因为15小于23,并且行的排序是词典。
您提到“我也获得了与商店15相关的行”,这让我想象行密钥中的第三个数字(________-_-23-
)是该行的某种属性。
我建议改变这个表的模式,使这个“门店数量”一栏,让你的钥匙能像20110103-1
和列“存储”你有这些数字15
或23
或什么的。
这样,在扫描中,可以过滤掉列存储= 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
是日期)作为时间戳(表格的单元格)而不是行键。这取决于你的应用程序。
,你可以打开HBase的外壳发出以下命令
scan 'YourHbaseTableName',{FILTER=>"(RowFilter(=,'regexstring:20110103'))"}
假设的HBase作为一个字节多个嵌套有序图。 因此,您需要将时间戳保存在二进制演示文稿中,以便在每个查询中获得正确的顺序。
我想您保存rowkey值的字符串数据类型,例如使用Java方法:
yourDateString.getBytes(encoding)
或
Bytes.toBytes(yourDateString)
通过HBase的API添加。
我的建议是将时间值保存为时间戳(长)。 这一长串应该被序列化为字节,然后保存在rowkey中。 请注意,由于不断上升的特性,在rowkey中保存时间戳有点问题。时间戳每毫秒会变大,因此每个新值都将保存到管理此区域的HBase区域。简而言之,您只需写入其中一个群集机器,这不是使用HBase群集的目标。 对于大小为100 machnies的群集,您可以使用salting(在rowkey前面放置一个随机数,以将所有值分配到整个群集中)。 查看phoenix项目。 它为你做所有的translating,salting等,提供简单的SQL语句。