2015-07-31 4 views
2

У меня есть следующая структура таблицы в Кассандре:Обновления Таблица В Кассандре

CREATE TABLE ssession (
    sessionid text PRIMARY KEY, 
    session_start_time timestamp, 
    updated_time timestamp 
); 

session_start_time время, когда конкретный сеанс становится активным и update_time время до пользователя будет делать некоторые activity.Here, sessionidsession_start_time и будет вставлен один раз, и updated_time будет обновляться по мере того, как пользователь будет активен.

I want to include only sessionid as the primary key.

Нормальный оператор обновления будет:

UPDATE ssession SET session_start_time = '2015-07-31 10:43:13+0530', 
updated_time = '2015-07-31 10:43:13+0530' WHERE sessionid = '22_865624098'; 

Здесь первый раз, когда я буду вставлять же session_start_timeupdated_time и .Но с следующий раз я должен буду обновлять только updated_time.

И мне нужен один запрос, чтобы сделать это. Поскольку я буду получать данные непрерывно (используя шторм для обработки данных).

Есть ли способ достичь этого?

ответ

2

Когда вы вводите данные INSERT или UPDATE (обновления и вставки одинаковы в cassandra), вам не нужно предоставлять все столбцы. Если вы просто хотите обновить updated_time, ваш запрос должен быть:

UPDATE ssession SET updated_time = '2015-07-31 10:43:13+0530' WHERE sessionid = '22_865624098'; 

Но это звучит, как вы хотите, чтобы убедиться, что session_start_time устанавливается в первый раз, что SESSIONID создается и только в первый раз, правильно?

Что вы можете использовать lightweight transactions и if not exists для создания данных с помощью session_start_time. Если есть уже ряд с этим session_id, вставка не будет применяться:

INSERT INTO ssession (sessionid, session_start_time, updated_time) values ('22_865624098', '2015-07-31 10:43:13+0530', '2015-07-31 10:43:13+0530') if not exists; 

Кассандра возвращает столбец [applied] в этом случае со значением true или false, если вставка была применена. Если false возвращается, вы можете просто запустить запрос на обновление, что только обновляет updated_time:

UPDATE ssession set updated_time = '2015-07-31 10:43:14+0531' where sessionid = '22_865624098'; 

Обратите внимание, что легкие сделки ввести некоторое снижение производительности, подробно описанная в статье, я связан выше. Он использует уровень последовательности «SERIAL», который является многофазным QUORUM. Это также шаблон «read-then-write», который не будет таким быстрым, как слепое записывание данных. Вы должны проверить эффективность этого решения и посмотреть, подходит ли он для вас.

+0

В качестве альтернативы вы можете кэшировать локально, какие учетные записи вы вставили, и предоставить session_start_time, когда он не был вставлен ранее. Если его нет в кеше, вы можете посмотреть его из кассандры и отреагировать, есть ли там запись. –

+0

Спасибо человек. Я думал сделать что-то подобное. 'if UPDATE ssession set updated_time = '2015-07-31 10: 43: 14 + 0531' where sessionid = '22_865624098' IF sessionid = 'some-value'; еще ОБНОВЛЕНИЕ ssession SET session_start_time = '2015-07-31 10: 43: 13 + 0530', updated_time = '2015-07-31 10: 43: 13 + 0530' ГДЕ SessionID = '22_865624098'; ' Возможно ли это? –

+0

Это не работает как 'PRIMARY KEY column 'sessionid' не может иметь условия IF' –

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