HBase行键和范围扫描
我有一个像20110103这样的行键模式,所以行键会像20110103-1-23-333 例如,当我使用扫描进行范围查询时, startRow->20110103-1-23- endRow->20110105-1-23- 我得到的行也不在上述范围内。例如,我也得到了行20110105-1-15-6666。我也得到了与商店15相关的行 我怎样才能解决这个问题??RegularExpressionFilter会解决此问题吗HBase行键和范围扫描,hbase,Hbase,我有一个像20110103这样的行键模式,所以行键会像20110103-1-23-333 例如,当我使用扫描进行范围查询时, startRow->20110103-1-23- endRow->20110105-1-23- 我得到的行也不在上述范围内。例如,我也得到了行20110105-1-15-6666。我也得到了与商店15相关的行 我怎样才能解决这个问题??RegularExpressionFilter会解决此问题吗 请就这个问题提供建议……在您列出的三行键中: 20110103-1-23-
请就这个问题提供建议……在您列出的三行键中:
20110103-1-23-
20110105-1-15-666
20110105-1-23-
在我看来,这是自然的排序顺序;以“666”结尾的一个确实在以“20110103”开头的一个之后
(有一点可能会让人困惑,对HBase来说,这些都只是字节,字典排序一次只进行一个字节;因此,“aaa”将在“aa”之后但在“ab”之前进行排序。第20110105-1-15-6666行正确地在这个范围内[20110103-1-23-,20110105-1-23-),因为15小于23,并且行的排序是字典式的。 您提到“我也在获取与store 15相关的行”,这让我想到行键中的第三个数字(
\uuuuuuuuuuuuuuuuuuuuuu23-
)是该行的某种属性
我建议更改此表的模式,将此“存储编号”设为一列,以便您的键看起来像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)
或
由HBase API添加
我的建议是将时间值保存为时间戳(long)。
该长度应序列化为字节,然后保存在rowkey中。
请注意,在rowkey中保存时间戳有点问题,因为时间戳会不断上升。时间戳会随着每毫秒的增加而变大,因此每个新值都会保存到管理此区域的HBase区域。因此,简单地说,您只需向其中一台群集计算机写入数据,而这不是使用HBase群集的目标。
对于大小为100机器的集群,可以使用satting(在rowkey前面放置一个随机数,将所有值分布到整个集群)。
看看这个项目。
它可以为您透明地执行序列化、salt等操作,提供简单的类似SQL的语句
Bytes.toBytes(yourDateString)