令牌函数在Cassandra中的意外行为

时间:2018-06-27 06:27:45

标签: cassandra cassandra-3.0

我在cassandra中有下表:

create table IF NOT EXISTS sample_table(
    col1 int,
    col2 int,
    col3 int,
    primary key(col1,col2)
);

上表当前有640行。 以下查询以查找令牌:

select system.token(col1),col1,col2,col3 from sample_table;

执行后,通知所有行都位于-9157060164899361011至9162265122815852158令牌之间。

现在,这显然意味着没有-9223372036854775808令牌的记录。

但是,当我在下面的查询中执行

    select system.token(col1),col1,col2,col3 from sample_table
 where token(col1)=-9223372036854775808;

即使没有返回的令牌都为-9223372036854775808,它却给出了全部640行作为答案。

对-9223372036854775807令牌执行相同的查询时,完全不返回任何正确的记录。

我发现,这种怪异的行为仅适用于-9223372036854775808令牌。

我正在使用murmur3partitioner。

如果有人知道其背后的原因,请解释。

1 个答案:

答案 0 :(得分:1)

从Cassandra文档中看来,最小令牌值(minimum long value in Java)用来表示环中的所有令牌。

来自Cassandra的Java驱动程序的官方JavaDoc

  

范围是从开始到结束,从结束到结束。当开始和结束是相同的令牌时,该字段为空,除非这是最小令牌,在这种情况下,范围覆盖整个环(这与CQL范围查询的行为一致)。