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

7
根据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)

这个查询应该返回创建时间为2000年的一行记录,但是它返回了零行记录。
                 objectid | createdon | price | foo
            ----------+-----------+-------+-----

            (0 rows)

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

根据您指向的文章,令牌函数只有在为集群选择ByteOrderedPartitioner时才能按您预期的方式使用。 - asliwinski
1个回答

7
尝试将大于/小于符号反转:
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)生成的哈希值是这三个中最小的,而不是最大的。

2
@Aron先生,感谢您的回复。这意味着我们不能依赖token()函数。您能告诉我们在什么情况下可以在select查询中使用token吗? - Gunwant
3
token() 函数通常在你想要查询整个大表时使用。通常,大结果集的查询会超时,因此你可以一次查询一个 token 范围,以增加成功的可能性。 - Aaron

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接