3

我的密钥包含三个部分:数字、类型、名称

“类型”只有 A 和 B 两种,而 num 可以有更多的值,例如 0,1,2..,30

我必须获取关于 num 和 type 的数据,即获取所有具有指定 num 和 type 的键的行。

我可以以以下形式存储数据:1.num|type|name 或 2.type|num|name

如果我使用部分键扫描,考虑 HBase 如何扫描数据,这是存储数据的最佳策略?

这就是我设置部分键扫描的方式:对于 1。

scan.setStartRow(Bytes.toBytes(num);
scan.setStopRow(Bytes.toBytes(num+1);

对于 2。

scan.setStartRow(Bytes.toBytes(type + "|" + num);
scan.setStopRow(Bytes.toBytes(type + "|" + (num+1));
4

2 回答 2

4

首先,我建议不要使用管道作为分隔符——即 ASCII 124 并且落在所有字母和数字之后,并且排序不会是你所期望的(除非你把所有东西都留下——但这会导致键过大)。对于 HBase 行键分隔符,您希望在所有有效键字符之前使用按字典顺序排列的东西来保持正确的排序。Tab 在 ASCII 9 上运行良好。

考虑到该类型只有两个有效值并假设我会采用随机分布num type。如果将来需要,这允许您仅在 num 上进行选择。仅以相反的顺序选择 numtype num是两次提取,一次用于类型“A”,另一次用于类型“B”。不是最有效的。

如果您很少只选择数字,那么使用它确实有意义,type num因为如果不灵活,那是行级别上最具选择性的。

真的,您应该同时尝试它们,看看哪种方法最适合您的数据。

于 2011-08-12T17:55:56.950 回答
1

您可以采取几种方法。

1) 您应该选择您将更频繁地扫描的布局。然后,对于频率较低的扫描类型,您可以进行完整扫描(或者如果可以的话,将其划定为范围)并使用过滤器,您可以构建一个行过滤器来过滤掉除您想要的项目之外的任何内容。关于过滤器:http: //hbase.apache.org/apidocs/index.html

2)您可以通过存储两次(每个行名一次)来复制数据。这会减慢写入速度,但如果您对两者都进行扫描,则对读取有很大帮助。当然磁盘使用量也翻了一番。

3)您可以使用替代行名称构建索引以指向相关行。

您采用什么方法在很大程度上取决于数据的访问模式和读/写比率。

于 2011-08-16T05:11:16.440 回答