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