我可以在 hbase 中进行单元格合并吗?

Can I do cell merging in hbase?

假设我有一个增量更新而不是覆盖的列(如按位或整数标志或求和列)。例如(假设只有 1 个版本):

现有单元格:[键:'k1',f1:sum:100]
即将到来的新单元格:[键:'k1',f1:sum:200]

然后我想这样更新单元格数据:sum = 100+200 = 300。 生成最终记录:
[key: 'k1', f1:sum: 300]

这里我想 MERGE 新单元格到旧单元格使用相同的密钥。 我怎样才能做到这一点?直接 put 会简单地覆盖旧单元格。 (同样只维护一个版本)。

我想出了一些想法,但它们似乎并不令人满意:

1> 在客户端首先 获取 旧值然后将总和添加到正在进行的 put 对象。

2> 使用协处理器。在 RegionObserver.prePut 中,我获取、添加和修改最终的 put 对象。这将计算推到服务器端,但仍然需要首先进行额外的查询(获取)(这可能很昂贵)。

除了上述在实时查询场景中的工作之外,但是批量加载数据合并呢?

我已经翻阅了很长时间的文件,但还没有找到任何线索。如果您能就此分享一些想法,我将不胜感激。

我使用的是 hbase-1.2.6。谢谢!

如果我正确理解您的用例并且值将是长整数,那么,我认为 HBase 增量操作应该适合您。有关详细信息,请查看 Increment 的 HBase 1.2.6 javadoc。

如果不是您想要的算术增量,HBase 也有一个 Append 操作,可用于以原子方式将更多数据附加到现有单元格。

请注意,javacdoc 提到增量和追加保证写入的原子性,但不保证读取的原子性,这是不正确的。他们实际上也保证读取的原子性(自 HBase 0.95 起),这在以后版本的文档中得到修复。

此外,Increment 和 Append 操作都不会执行额外的 Get rpc。他们的工作方式是在服务器端获取行锁,然后在同一锁下在服务器上进行读取和写入。