checkAndPut 总是成功

checkAndPut always succeeds

我在 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,还是我做错了什么?

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

但是一般来说,尝试以这种方式使用 CompareFilter 并不是一个好的做法,因为它是对字节执行词法比较,而不是逻辑整数比较。

有关更多信息和上下文,请参阅:

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

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

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