2016-07-07 2 views
2

хранить свои данные в базе данных Cassandra NoSQL со следующей схемой:Cassandra Time Series рода

CREATE TABLE bidding3(
    item_id bigint, 
    user_id bigint, 
    bid_price bigint, 
    current_time text, 
    PRIMARY KEY (item_id,current_time) 
) WITH CLUSTERING ORDER BY (current_time,DESC); 


CREATE TABLE bidding_user(
    item_id bigint, 
    user_id bigint, 
    bid_price bigint, 
    current_time text, 
    PRIMARY KEY (user_id,current_time) 
) WITH CLUSTERING ORDER BY (current_time,DESC); 

А потом я использую SELECT * FROM bidding_user LIMIT 5;. Я бы ожидал, что данные будут упорядочены по временным рядам, и это было сделано в первый день, но сегодня все изменилось.

Wed Jul 06 20:09:04 UTC 2016 
Wed Jul 06 19:10:04 UTC 2016 
Thu Jul 07 19:09:04 UTC 2016. 

Я думаю, что база данных игнорирует дату, но заботится только о времени.

Любая идея, как исправить это?

ответ

4
SELECT * FROM bidding_user LIMIT 5; 

Проблема здесь в том, что вы не указали пункт WHERE. Cassandra поддерживает только порядок сортировки в разделе раздела. Ваш ключ раздела - user_id, поэтому я предполагаю (поскольку вы только показываете нам столбец current_time, а не user_id) состоит в том, что ваши первые две строки разделяют user_id, а user_id для третьей строки отличается.

Рассмотрим следующую таблицу:

CREATE TABLE stackoverflow.timestamptest (
    userid text, 
    activetime timestamp, 
    value text, 
    PRIMARY KEY (userid, activetime) 
) WITH CLUSTERING ORDER BY (activetime ASC) 

Если я запрос без ИНЕКЕ, я получаю:

[email protected]:stackoverflow> SELECT userid,activetime FROM timestamptest ; 

userid | activetime 
--------+-------------------------- 
     a | 2015-09-25 11:33:33+0000 
     a | 2015-10-22 14:26:00+0000 
     c | 2015-12-28 19:12:00+0000 
     d | 2016-01-22 14:57:54+0000 
     d | 2016-01-22 14:57:54+0000 
     d | 2016-07-07 19:44:04+0000 
     b | 2015-10-22 14:26:00+0000 
     b | 2016-07-07 19:44:10+0000 

(8 rows) 

Как вы можете видеть, порядок моего ключа кластеризации (activetime) действительно имеет смысл только в каждом ключе раздела (userid).

Другими словами, если вы хотите, чтобы ваш результирующий набор был отсортирован, вам нужно указать свой ключ user_id в предложении WHERE с вашим запросом.

Не самостоятельно продвигать или что-нибудь, но я написал статью на эту тему в начале прошлого года, который может помочь вам понять это лучше:

PlanetCassandra: We Shall Have Order!

0

current_time имеет тип text поэтому сортировка выполняется на основе символов строки даты.

Попробуйте изменить тип current_time на timestamp.

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