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

e5nqia27  于 2021-06-02  发布在  Hadoop
关注(0)|答案(1)|浏览(360)

假设我有一个以增量方式更新而不是覆盖的列(如按位或整数标志或求和列)。例如(假设只有一个版本):
现有单元格:[键:“k1”,f1:总和:100]
更新新单元格:[键:“k1”,f1:总和:200]
然后我想这样更新单元格数据:sum=100+200=300。最终记录:
[键:“k1”,f1:总和:300]
在这里,我想用相同的键将新单元格合并到旧单元格中。我怎样才能做到这一点?直接put将覆盖旧单元格(同样,只保留一个版本)。
我提出了一些想法,但似乎并不令人满意:
1> 在客户端,首先获取旧值,然后向正在进行的put对象添加sum。
2> 使用协处理器。在regionobserver.preput中,我执行get、添加和修改final put对象。这会将计算推送到服务器端,但仍然需要先执行一个额外的查询(get)(这可能会很昂贵)。
除了上述工作在实时查询场景,但批量加载数据合并呢?
我查阅这些文件已经有一段时间了,但还找不到线索。如果你能和我分享一些想法,我会非常感激的。
我正在使用hbase-1.2.6。谢谢!

u59ebvdq

u59ebvdq1#

如果我正确理解了您的用例,并且值将是长整数,那么,我认为hbase增量操作应该适合您。有关详细信息,请参阅hbase 1.2.6 javadoc。
如果不是您想要的算术增量,那么hbase也有一个append操作,它可以用于原子地向现有单元格追加更多数据。
注意,javacdoc提到递增和追加保证了写入的原子性,但不保证读取的原子性,这是不正确的。它们实际上也保证了读取的原子性(从hbase 0.95开始),这在以后的版本中的文档中得到了修复。
另外,increment和append操作都不会执行额外的get-rpc。它们的工作方式是在服务器端获取一个行锁,然后在同一个锁下在服务器上执行读操作,然后执行写操作。

相关问题