HBase行键和范围扫描

时间:2012-04-23 08:45:23

标签: hbase

我有一个像20110103这样的行键模式---所以行键就像20110103-1-23-333。

例如,当我使用扫描进行范围查询时, startRow - > 20110103-1-23- endRow - > 20110105-1-23-

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

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

请就此问题提出建议......

4 个答案:

答案 0 :(得分:8)

您列出的三个行键中有:

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

这看起来像是对我的自然排序;以“666”结尾的那个确实来自以“20110103”开头的那个。

(混淆的一点可能是HBase,这些都只是字节,并且字典排序一次完成一个字节;因此,“aaa”将在“aa”之后但在“ab”之前排序。)

答案 1 :(得分:1)

你可以打开hbase shell发出以下命令

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

答案 2 :(得分: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是日期)作为时间戳(表格的单元格)而不是行键。这取决于你的申请。

答案 3 :(得分:0)

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

我认为你将rowkey-values保存在字符串数据类型中,例如使用java方法:

yourDateString.getBytes(encoding) 

Bytes.toBytes(yourDateString)

由HBase API添加。

我的建议是将时间值保存为时间戳(长)。 这个long应序列化为字节,然后保存在rowkey中。 请注意,由于不断增加的性质,在rowkey中保存时间戳有点问题。时间戳将随着每毫秒变大,因此每个新值都将保存到管理该区域的HBase区域。很简单地说,您只需要写入一台群集计算机,这不是使用HBase群集的目标。 对于大小为100 machnies的群集,您可以使用salting(在rowkey前放置一个随机数,以在整个群集中分配所有值)。 查看phoenix项目。 它为您提供序列化,盐化等所有功能,提供简单的SQL语句。