3

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

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

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

我怎样才能解决这个问题 ??将 RegularExpressionFilter 解决这个....

请就这个问题提出建议....

4

4 回答 4

8

您列出的三个行键中:

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

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

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

于 2012-04-23T12:24:37.033 回答
2

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

scan 'YourHbaseTableName',{FILTER=>"(RowFilter(=,'regexstring:20110103'))"}
于 2013-09-03T16:19:54.630 回答
1

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

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

我建议更改此表的架构以使此“商店编号”成为一列,以便您的键看起来像20110103-1并且在“商店”列中您拥有这些数字1523其他内容。

这样,在 Scan 中,您可以过滤掉 column store=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是日期)作为时间戳(表格的单元格)而不是行键。这取决于您的应用程序。

于 2012-04-23T12:36:56.350 回答
0

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

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

yourDateString.getBytes(encoding) 

或者

Bytes.toBytes(yourDateString)

由 HBase API 添加。

我的建议是将时间值保存为时间戳(长)。这个 long 应该被序列化为字节,然后保存在 rowkey 中。请注意,由于不断上升的性质,在行键中保存时间戳有点问题。时间戳每毫秒都会变大,因此每个新值都将保存到管理该区域的 HBase 区域。简单地说,您只需写入其中一台集群机器,这不是使用 HBase 集群的目标。对于大小为 100 个机器的集群,您可以使用盐渍(在 rowkey 前面放置一个随机数以将所有值分布在整个集群中)。查看凤凰项目。它透明地为您完成序列化、加盐等操作,提供简单的类似 SQL 的语句。

于 2013-09-28T04:57:03.120 回答