checkAndPut总是成功的

时间:2017-05-25 06:50:08

标签: java hadoop bigtable google-cloud-bigtable

我在bigtable中保留一个计数器,并希望在计数器达到X时放入一些数据。我目前正在这样做:

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,但它仍然是真的。

bigtable不支持checkAndPut,或者我做错了什么?

2 个答案:

答案 0 :(得分:1)

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

然而,一般来说,尝试使用CompareFilter并不是一种很好的做法,因为它对字节进行词法比较,而不是逻辑整数比较。

有关更多信息和背景信息,请参阅:

就主要的HBase API而言,有计划在未来的HBase版本中更好地处理这个问题,例如:在提议的HBase 2.0中,它包含了一个受有序项目启发的新OrderedBytes数据类型:

与此同时,您可以以某种方式有序地合并,或者可能使用HBase计数器和增量操作。

答案 1 :(得分:1)

问题是,我正在使用依赖项bigtable-hbase-1.2:0.9.6.2,它可能与另一个依赖项发生冲突。我认为这导致了一个不正确的CheckAndMutateRequest被静默发送,并且checkAndPut中的签入总是通过。我切换到bigtable-hbase-1.2:0.9.2并且所有内容都已正确评估。