2017-01-23 25 views
3

thisのドキュメントによれば、私はtoken()関数を使用して選択クエリを試していましたが、Cassandra - token()関数を使用したクエリの選択

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'); 

データ -

私はカサンドラのバージョンの下に使用しています

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

は、私は以下の表のためのトークンのクエリをしようとしていた

 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) 

なぜあなたのSELECTに機能を追加すると、あなたが理解するのに役立つはずである:生成されたハッシュ化されたトークンの値がありません

[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

関連する問題