2013-11-28 35 views
3

我们有计数器列的家庭,这样的事情: 创建列家庭visits_counter_cf 与key_validation_class = UTF8Type 和比较= '的CompositeType(LongType,LongType,UTF8Type)' 和default_validation_class = CounterColumnType ;从卡桑德拉计数器列家庭删除整个行

当我们从CLI列中删除一行(我们使用Hector)时,它看起来会被删除 但是当我们在同一行中增加计数器(相同的rowkey)时,它会继续从先前的计数器值中增加计数器(删除前的值)。 请帮助理解此行为,

+2

什么版本的Cassandra? – zznate

+0

这有点旧了:-) 1.0.9 – user3021296

+0

CLI中的行为相同。当我增加一个计数器然后删除该行并再次递增计数器,计数器值为2但不是1如预期的那样。 – user3021296

回答

2

当前的Cassandra计数器实现有许多严重的限制。其中之一是在删除列(或删除行中的列)上的增量被认为是未定义的行为。从Cassandra counters wiki page

计数器的去除本质上是有限的。例如,如果您非常快速地发出序列“增量,删除,增量”,删除操作可能会丢失(如果由于某种原因删除恰好是最后收到的消息)。因此,删除计数器仅用于确定删除,即删除的计数器之后不增加。这也适用于行删除:如果删除一行计数器,则增加该行中的任何计数器(在删除之前存在)将导致未确定的行为。

总之,您不应该尝试在计数器列族中重新使用已删除的行。

+0

非常感谢您 – user3021296

+0

如果您已经删除了该行并且您仍然需要使用相同的分区键,该怎么办?这似乎是一个严重的缺陷。我的分区键基于不能更改的ID,因此删除后我不能突然创建新的分区键。有没有机制来修复或修复这个问题? – KingOfHypocrites

+0

重新使用删除的计数器列很可能会导致计数错误。 – psanford