如何在Hbase中检索大量结果(如SQL中的IN)

时间:2013-06-16 18:48:48

标签: hbase

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

的productid时间戳

与家庭股票,价格等。

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

例如:给我所有来自product-id 4711,4744,8485,8585的数据......不超过一次通话。

此致 凯文

2 个答案:

答案 0 :(得分:0)

如果你有足够新的HBase版本,你可以使用HTable batch method在一次通话中获得几个ID

答案 1 :(得分:0)

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

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

  1. 您可以通过单个GET调用获取每个调用,每次都会产生RPC开销。
  2. 你可以通过一次batch调用获得其中许多,只有一个RPC(每个区域,如果你的行位于多个区域;并且受到批量大小的限制,如果你得到很多他们)。对于你的情况来说,这显然胜过#1,看起来似乎。
  3. 如果您的行位于行键的一个小空间中,您可以将它们手动组装成多个扫描并行运行,然后在客户端进行后置过滤,只返回您想要的那些(在在你的情况下,你可以从4711-> 4744和8485-> 8585扫描。这需要更多智能才能正确,但可能会在一些纯粹的性能场景中获胜,具体取决于表的稀疏性或密度,行大小等。您可能只能通过
  4. 来确定这一点。
  5. 你可以使用SEEK_NEXT_USING_HINT的自定义过滤器来保存这种情况下的原始扫描时间,通过执行“跳过扫描”,一旦你看到你已经通过一个所需ID集群的末尾,你跳到下一个。同样,根据表格的特点,这可能是也可能不是胜利。
  6. 还有一个不错的选择:你可以使用Phoenix,一个位于HBase之上的SQL皮肤。对于这种情况,它已经内置了Skip Scans,并作为JDBC驱动程序公开。它还有许多其他的性能优化,从头开始创建(聚合协处理器等)是很费力的。

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