Cassandra - select 使用 token() 函数查询

Cassandra - select query with token() function

根据 this 文档,我正在尝试使用其中包含 token() 函数的 select 查询,但它给出了错误的结果。

我使用的是以下 cassandra 版本

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

我正在尝试以下 table -

的令牌查询
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');

数据在table--

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

Select查询是--

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

此查询假定 return 行创建于 2000 年,但它 return 是零行。

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

            (0 rows)

根据我的理解,token(objectid,createdOn) > token(1,1000) 和 token(objectid,createdOn) < token(1,3000) 应该 select 分区键值为 1 的行和 2000。

我的理解对吗?

试着翻转你的 greater/less-than 标志:

aploetz@cqlsh:Whosebug> 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:Whosebug> 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) 生成了一个散列,它是三个散列中 最小的 ,而不是最大的。