0

我将产品的价格和库存(时间序列)存储在我的数据库中。我的 rowkey 具有以下结构:

产品时间戳

与家庭库存,价格等。

是否可以扫描超过 1 个产品 ID?

例如:给我来自 product-id 4711、4744、8485、8585 的所有数据......而不需要超过一个电话。

问候凯文

4

2 回答 2

0

如果您有足够新的 HBase 版本,您可以使用 HTable批处理方法在一次调用中获取多个 id

于 2013-06-16T19:38:16.543 回答
0

HBase 有两个基本的检索选项:GET 和 SCAN。SCAN 意味着:从第 N 行开始,并按顺序返回所有记录,直到您到达第 M 行(其中 M >= N)。GET 只是单行扫描 (M==N);事实上,它实际上是这样实现的,这是有道理的,因为行是排序的,所以从根本上来说,没有更有效的方法可以到达其中之一。

因此,对于您的情况,您有几个选择:

  1. 您可以通过一个 GET 调用来获取每一个,这每次都会产生 RPC 开销。
  2. 您可以通过单个批处理调用获得其中的许多,这只会产生一个 RPC(每个区域,如果您的行位于多个区域;并且受批处理大小的限制,如果您获得大量它们)。看来,对于您的情况而言,这显然是对#1的胜利。
  3. 如果您的行聚集在行键的一个小空间中,您可以交替手动将它们组合成多个扫描以并行运行,然后在客户端进行后过滤以返回您想要的那些(在您的情况下,您可以从 4711->4744 和 8485->8585 扫描)。这需要更多的聪明才智才能正确,但可能会在某些纯粹的性能场景中获胜,具体取决于表的稀疏性或密度、行大小等。您可能只能通过以下方式确定这一点
  4. 在这种情况下,您可以使用带有SEEK_NEXT_USING_HINT的自定义过滤器来节省原始扫描时间,通过执行“跳过扫描”,一旦您看到您已经通过了一组所需 ID 的末尾,您就跳到下一个. 同样,根据桌子的特点,这可能会也可能不会赢。

还有另一个不错的选择:您可以使用Phoenix,这是 HBase 之上的一种 SQL 皮肤。它已经为这种情况内置了 Skip Scans,并作为 JDBC 驱动程序公开。它还有许多其他性能优化,从头开始创建会很费力(聚合协处理器等)。

(完全披露,我为创建 Phoenix 的公司工作,但它是完全开源的,所以我没有任何特别的既得利益来建议它,除了认为它很酷。:)

于 2013-06-16T20:16:59.387 回答