2017-01-23 76 views
3

根據this文檔,我嘗試了一個帶有token()函數的select查詢,但它給出了錯誤的結果。Cassandra - 使用token()函數選擇查詢

我使用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)>令牌(1,1000)和令牌(OBJECTID,createdOn)<令牌(1,3000)應選擇具有分區鍵行值爲1和2000

我的理解是否正確?

回答

3

嘗試圍繞翻轉你的大於/小於號招牌:

[email protected]: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) 

添加功能,您的選擇可以幫助你理解爲什麼:

[email protected]: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)產生的散列是三個中最小的,,而不是最大的。

+1

@Aron謝謝您的回覆先生。這意味着我們無法在token()函數上進行中繼。你能告訴我們什麼時候我們可以在選擇查詢中使用令牌。 – Gunwant

+2

@Gunwant'token()'當你想查詢整個大表時很有意義。通常,對於大型結果集的查詢將會超時,因此您可以一次查詢令牌範圍以使其更有可能成功。 – Aaron