2017-01-23 2 views
3

Nach this Dokumentation, ich habe versucht, eine Select-Abfrage mit token() -Funktion darin, aber es gibt falsche Ergebnisse.Cassandra - Abfrage mit token() Funktion auswählen

Ich verwende unter cassandra Version

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

Ich habe versucht, Token-Abfrage für Tabelle unten -

CREATE TABLE price_key_test (
objectid int, 
createdOn bigint, 
price int, 
foo text, 
PRIMARY KEY ((objectid, createdOn), price)); 

Eingefügt Daten -

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

Daten in der Tabelle -

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

Wählen Sie Abfrage -

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

Diese Abfrage nehme Reihe mit CreatedOn 2000 zurück, aber es gibt keine Zeilen.

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

      (0 rows) 

Nach meinem Verständnis, Token (objectid, CreatedOn)> Token (1,1000) und Token (objectid, CreatedOn) < Token (1,3000) sollte 1 mit dem Wert Zeile mit Partitionsschlüssel auswählen und 2000 .

Ist mein Verständnis korrekt?

Antwort

3

Versuchen Sie mehr/weniger-als-Zeichen um Flipping:

[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) 

Hinzufügen der Funktion SELECT sollten Sie warum helfen zu verstehen:

[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) 

Die schraffierten Token generierten Werte sind nicht notwendigerweise proportional zu ihren ursprünglichen numerischen Werten. In Ihrem Fall erzeugte token(1,3000) einen Hash, der der kleinste der drei war, und nicht der größte.

+1

@Aron Danke für die Antwort Herr. Das bedeutet, dass wir die Funktion token() nicht weitergeben können. Können Sie uns tel, wann können wir Token in Select-Abfrage verwenden. – Gunwant

+2

@Gunwant 'token()' macht Sinn, wenn Sie eine große Tabelle in ihrer Gesamtheit abfragen wollen. In der Regel wird bei Abfragen für große Ergebnismengen ein Zeitlimit überschritten, sodass Sie jeweils einen Token-Bereich abfragen können, um den Erfolg zu erhöhen. – Aaron

Verwandte Themen