2017-05-25 71 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。 –

相关问题