checkandput总是成功的

p4rjhz4m  于 2021-06-01  发布在  Hadoop
关注(0)|答案(2)|浏览(310)

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

bqf10yzr

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计数器和增量操作。

mlnl4t2r

mlnl4t2r2#

问题是,我使用的是依赖关系 bigtable-hbase-1.2:0.9.6.2 ,这可能与另一个依赖项冲突。我想,这是因为 CheckAndMutateRequest 悄无声息地发送并办理登机手续 checkAndPut 总是过去。我换成了 bigtable-hbase-1.2:0.9.2 一切都评估正确。

相关问题