代码之家  ›  专栏  ›  技术社区  ›  user1206899

我可以在hbase中进行细胞合并吗?

  •  0
  • user1206899  · 技术社区  · 7 年前

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

    现有单元格: [键:“k1”,f1:总和:100]
    升级新单元: [键:“k1”,f1:总和:200]

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

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

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

    1>首先在客户端 旧值然后将总和添加到正在进行的

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

    除此之外,即使在实时查询场景中,上述功能也可以发挥作用,但批量加载数据合并又如何呢?

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

    我正在使用hbase-1.2.6。谢谢

    1 回复  |  直到 7 年前
        1
  •  1
  •   Ashu Pachauri    7 年前

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

    Append 操作,该操作可用于将更多数据自动附加到现有单元格。

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

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