2012-12-02 133 views
8
  1. 我是HBase的新手,我在HBase客户端API中找到,更新操作不支持?那是对的吗?
  2. 如果是这样,那么建议的最佳实践是如何更新特定rowkey的值?

回答

11

您可以使用PUT来创建或更新任何单元格的值。 你不要需要使用删除,除非你想新版本没有一些旧的单元格。

说,我们有

r1:f1:c1:value1 
r1:f1:c2:value2 

你可以把R1:F1:C1新值,你会得到:实际上每个单元存储为rowkey,列族

r1:f1:c1:new value 
r1:f1:c2:value2 

注,单元格,时间戳,版本和值。因此,根据您设置版本的方式(每列家族),您还可以访问旧值,包括执行时间点查询以查看删除的值。

+0

谢谢,你的回答很明确,并且帮助我更好地理解HBase(我只是刚刚开始调查)。 – tonio

+3

嗨@Arnon,我的问题是关于如何以原子方式更新。我想在原子操作序列中进行读取(GET)和更新。假设在某种情况下如何更新取决于读取的值,所以我想避免读取和更新之间的任何更新。在你的样本中,如何实现目标? –

+4

你可以在HTable API中使用checkAndPut或checkAndDelete http://hbase.apache.org/apidocs/org/apache/hadoop/hbase/client/HTable.html#checkAndPut(byte [],byte [],byte [] ,byte [],org.apache.hadoop.hbase.client.Put) –

4

我认为你想要做的是执行Put操作。 您可以看看HBase的Put API client docs以及本文的标题为:Java Example Code using HBase Data Model Operations的一些示例以及操作说明。

要更新行,您必须在单个突变中发出“删除”和“放入”序列,以便它们在外部被看作是更新。

请参阅Class RowMutations documentation了解如何构建此类通话。

+0

嗨tonio,纠正我,如果我错了。我没有看到任何Put API支持更新操作或示例代码。对于更新,我的意思是,在HBase表中已经有一行,例如,行键是r1,它有一列称为c1,并且在单元格r1/c1中有值。对于更新,我的意思是我想我想将单元格r1/c1的值更改为其他值。如果我错了,请随时纠正我。 –

+0

对,如果你想改变一行中的值,你必须结合删除和放入一个原子呼叫。查看更新的答案。 – tonio

+0

谢谢,我的问题得到解答。 –