2017-01-23 2 views
3

В соответствии с документацией this, я пытался выбрать запрос с функцией token(), но он дает неправильные результаты.Cassandra - выберите запрос с функцией token()

Я использую ниже Кассандру версии

[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 Спасибо за ответ sir. Это означает, что мы не можем передавать функцию token(). Можете ли вы связаться с нами, когда мы можем использовать токен в выбранном запросе. – Gunwant

+2

@Gunwant 'token()' имеет смысл, если вы хотите запросить большую таблицу целиком. Как правило, запросы для больших наборов результатов будут тайм-аутом, поэтому вы можете запросить диапазон токенов за раз, чтобы сделать его более вероятным. – Aaron

Смежные вопросы