我在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,或者我做错了什么?
答案 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
并且所有内容都已正确评估。