Cassandra - 使用token()函数选择查询

时间:2017-01-23 14:15:01

标签: cassandra token cql

根据this文档,我正在尝试使用带有token()函数的select查询,但它会给出错误的结果。

我在cassandra版本下使用

[cqlsh 5.0.1 | Cassandra 2.2.5 | CQL spec 3.3.1 | Native protocol v4]

我正在为下表 -

尝试令牌查询
CREATE TABLE price_key_test (
objectid int,
createdOn bigint,
price int,
foo text,
PRIMARY KEY ((objectid, createdOn), price));

插入数据 -

insert into nasa.price_key_test (objectid,createdOn,price,foo) values (1,1000,100,'x');
insert into nasa.price_key_test (objectid,createdOn,price,foo) values (1,2000,200,'x');
insert into nasa.price_key_test (objectid,createdOn,price,foo) values (1,3000,300,'x');

表格中的数据 -

        objectid | createdon | price | foo
    ----------+-----------+-------+-----
            1 |      3000 |   300 |   x
            1 |      2000 |   200 |   x
            1 |      1000 |   100 |   x

选择查询是 -

select * from nasa.price_key_test where token(objectid,createdOn) > token(1,1000) and token(objectid,createdOn) < token(1,3000)

此查询假设返回带有createdOn 2000的行,但它返回零行。

                 objectid | createdon | price | foo
            ----------+-----------+-------+-----

            (0 rows)

根据我的理解,令牌(objectid,createdOn)&gt;令牌(1,1000)和令牌(objectid,createdOn)&lt; token(1,3000)应选择具有值为1和2000的分区键的行。

我的理解是否正确?

1 个答案:

答案 0 :(得分:4)

尝试翻转你的更大/更少的标志:

aploetz@cqlsh:stackoverflow> SELECT * FROM price_key_test 
    WHERE token(objectid,createdOn) < token(1,1000) 
    AND token(objectid,createdOn) > token(1,3000) ;

 objectid | createdon | price | foo
----------+-----------+-------+-----
        1 |      2000 |   200 |   x

(1 rows)

token()函数添加到SELECT中可以帮助您理解原因:

aploetz@cqlsh:stackoverflow> SELECT objectid, createdon, token(objectid,createdon), 
    price, foo FROM price_key_test ;

 objectid | createdon | system.token(objectid, createdon) | price | foo
----------+-----------+-----------------------------------+-------+-----
        1 |      3000 |              -8449493444802114536 |   300 |   x
        1 |      2000 |              -2885017981309686341 |   200 |   x
        1 |      1000 |              -1219246892563628877 |   100 |   x

(3 rows)

生成的散列标记值不一定与其原始数值成比例。在您的情况下,token(1,3000)生成的散列是三者中的最小,而不是最大的。