2017-05-25 61 views
0

我保持Bigtable中的計數器,並希望把一些數據,當計數器達到X.我目前做這樣的:checkAndPut總是成功

Put put = new Put(EXAMPLE_ROW_KEY); 
put.addColumn(EXAMPLE_COLUMN_FAMILY, NEW_QUALIFIER, NEW_VALUE); 

boolean success = table.checkAndPut(EXAMPLE_ROW_KEY, 
            INFO_COLUMN_FAMILY_NAME, 
            SIZE_COLUMN, 
            CompareFilter.CompareOp.LESS, 
            Bytes.toBytes(10000L), put); 

的問題是,成功是永遠即使尺寸超過10000L,也始終保持真實和新的價值。我試圖使用CompareFilter.CompareOp.GREATER_OR_EQUAL具有完全相同的值,它仍然是正確的。

是否checkAndPut不受bigtable支持,還是我做錯了什麼?

回答

1

問題是,我正在使用依賴項bigtable-hbase-1.2:0.9.6.2,它可能與另一個依賴項相沖突。我假設這樣會導致不正確的CheckAndMutateRequest被悄悄地發送,並且checkAndPut中的檢查總是通過。我切換到bigtable-hbase-1.2:0.9.2和一切正確評估。

+1

有趣,感謝您的更新。我很高興你能夠暢通無阻,但看起來似乎也可能表明迴歸,因此Cloud Bigtable工程團隊將對此進行進一步調查。 –

1

我們支持Cloud Bigtable中的table.checkAndPut操作。

但是,通常這樣嘗試和使用CompareFilter並不是一個好習慣,因爲它正在對字節執行詞法比較,而不是邏輯整數比較。

欲瞭解更多信息和背景,請參閱:

至於主要HBase的API,有計劃地處理這個問題未來HBase版本會更好,例如在建議HBase的2.0,其採用了新的OrderedBytes數據類型的有序項目的啓發:

在此期間,你可能能夠納入有序不知何故,或者使用HBase計數器和增量操作。

+1

謝謝,澄清。我修改了代碼來檢查字符串是否相等,但不幸的是我得到的結果不正確。即使值不同,檢查成功。 – safyia

+3

您可以在此跟蹤有關此問題的進度:https://github.com/GoogleCloudPlatform/cloud-bigtable-client/issues/1348。 –