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

Hadoop 我可以在hbase中进行单元合并吗?,hadoop,hbase,hdfs,hadoop2,bulk-load,Hadoop,Hbase,Hdfs,Hadoop2,Bulk Load,假设我有一个非重写的增量更新列(如按位或整数标志或求和列)。例如(假设只有一个版本): 现有单元格:[关键字:“k1”,f1:总和:100] 向上提交新单元格:[关键字:“k1”,f1:sum:200] 然后我想用这种方式更新单元格数据:sum=100+200=300。 产生最终记录: [键:“k1”,f1:sum:300] 在这里,我想用相同的键将新单元格合并到旧单元格中。 我怎样才能做到这一点?直接put将覆盖旧单元格。(同样,只保留一个版本) 我提出了一些想法,但似乎并不令人满意: 1>

假设我有一个非重写的增量更新列(如按位或整数标志或求和列)。例如(假设只有一个版本):

现有单元格:[关键字:“k1”,f1:总和:100]
向上提交新单元格:[关键字:“k1”,f1:sum:200]

然后我想用这种方式更新单元格数据:sum=100+200=300。 产生最终记录:
[键:“k1”,f1:sum:300]

在这里,我想用相同的键将新单元格合并到旧单元格中。 我怎样才能做到这一点?直接put将覆盖旧单元格。(同样,只保留一个版本)

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

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

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

除此之外,即使上述工作在实时查询场景中也可以进行,但是批量加载数据合并又如何呢

我查阅这些文件已经有一段时间了,但还没有找到线索。如果你能分享一些关于这方面的想法,我将不胜感激


我正在使用hbase-1.2.6。谢谢

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

如果它不是您想要的算术增量,HBase也有一个操作,可以使用该操作将更多数据原子地附加到现有单元中

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


此外,增量和追加操作都不会执行额外的Get-rpc。它们的工作原理是在服务器端获取一个行锁,然后在同一个锁下在服务器上执行读操作,然后再执行写操作。

在我的例子中,要放入的新单元格值在某种程度上取决于现有单元格,它可能比简单的递增或追加更复杂。例如,我有一个旧的单元格值,它是一个整数K,我想将它更新为K_new=K^K',其中K'是生产中的某种增量值。我发现了一个可能相关的api:Table::checkAndPut()。但我不知道如何使用它。你认为这有帮助吗?谢谢。我认为上面列出的api只会帮助实现原子操作。最后我必须做一个接一个接一个接一个的动作。