我在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);
问题是,成功永远是真的,新的价值总是放在,即使大小超过10000升。我试着用 CompareFilter.CompareOp.GREATER_OR_EQUAL
值完全相同,这仍然是真的。
是bigtable不支持checkandput,还是我做错了什么?
2条答案
按热度按时间bqf10yzr1#
我们确实支持cloud bigtable中的table.checkandput操作。
不过,一般来说,尝试以这种方式使用comparefilter并不是一种很好的做法,因为它是对字节执行词汇比较,而不是逻辑整数比较。
有关更多信息和上下文,请参阅:
如何在hbase中使用原子计数器上的过滤器
hbase中的简单整数比较
hbase“中间”筛选器
http://apache-hbase.679495.n3.nabble.com/filters-failing-to-compare-negative-numbers-int-float-double-or-long-td4057268.html
至于主hbase api,有计划在将来的hbase版本中更好地处理此问题,例如在建议的hbase 2.0中,它包含了一个新的orderedbytes数据类型,该数据类型受Ordered项目的启发:
https://hbase.apache.org/apidocs/org/apache/hadoop/hbase/util/orderedbytes.html
https://github.com/ndimiduk/orderly
在此期间,您可以以某种方式合并有序,或者使用hbase计数器和增量操作。
mlnl4t2r2#
问题是,我使用的是依赖关系
bigtable-hbase-1.2:0.9.6.2
,这可能与另一个依赖项冲突。我想,这是因为CheckAndMutateRequest
悄无声息地发送并办理登机手续checkAndPut
总是过去。我换成了bigtable-hbase-1.2:0.9.2
一切都评估正确。