2012-12-02 70 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

謝謝,我的問題得到解答。 –