2016-10-14 12 views
0

Я пытаюсь смоделировать некоторые данные временных рядов в Кассандре, которые я смог сделать со старым бережливым клиентом, но CQL, похоже, отбрасывает меня.CAS с CQL в Cassandra

Я хочу добавить новый столбец в свою строку, если соответствующее значение столбца совпадает.

Мое определение таблицы:

CREATE TABLE TestTable (
    key int, 
    base uuid, 
    ts int,     // Timestamp (column name) 
    val text,     // Timestamp value (column value) 
    PRIMARY KEY (key, ts) 
) WITH CLUSTERING ORDER BY (ts DESC); 

Что я предполагаю, что бы выглядеть это:

Row | UUID | TS | TS | TS 
--- | ---- | --- | ---| --- 
1 | id1 | 1 | 2 | 3 
--- | --- | --- | ---| --- 
2 | id2 | 1 | 5 | 6 

Так, по существу, я могу иметь кучу отметки времени для данной строки и Единый UUID для ряда. UUID необходимо обновить для каждой новой вставки столбца TS.

Так вставляет в работе строки просто отлично:

insert into TestTable(key, base, ts, val) values (1, dfb63886-91a4-11e6-ae22-56b6b6499611, 50, 'one') 

Но я не в состоянии выяснить способ, с помощью CQL, чтобы вставить новый столбец в строку, используя Кассандры транзакции (CAS).

Это один терпит неудачу:

insert into TestTable(key, base, ts, val) values (1, dfb63886-91a4-11e6-ae22-56b6b6499611, 70, 'four') if base = dfb63886-91a4-11e6-ae22-56b6b6499611; 

с ошибкой:

SyntaxException: <ErrorMessage code=2000 [Syntax error in CQL query] message="line 1:106 mismatched input 'base' expecting K_NOT (..., 70, 'four') if [base] =...)"> 

и запрос:

update TestTable set val = 'four', ts=70 where key = 1 if base = dfb63886-91a4-11e6-ae22-56b6b6499611; 

терпит неудачу с ошибкой:

InvalidRequest: code=2200 [Invalid query] message="PRIMARY KEY part ts found in SET part" 

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

IIRC, это было легко сделать это с клиентом бережливость, но с помощью этого не вариант =/

ответ

0

Существует хороший учебник о серии данных here

В двух словах, ваш Составной ключ будет ваш уникальный идентификатор (как UUID, что вы предлагающей) и метку времени, так что вы сможете добавить столько событий/значений, связанных с UUID

CREATE TABLE IF NOT EXISTS TestTable (
    base uuid, 
    ts timestamp,    // Timestamp (column name) 
    value text,     // Timestamp value (column value) 
    PRIMARY KEY (base, ts) 
) WITH CLUSTERING ORDER BY (ts DESC); 

Добавление значения будут иметь один и тот же UUID с различными временами :

INSERT INTO TestTable (base, ts, value) 
    VALUES (467286c5-7d13-40c2-92d0-73434ee8970c, dateof(now()), 'abc'); 

INSERT INTO TestTable (base, ts, value) 
    VALUES (467286c5-7d13-40c2-92d0-73434ee8970c, dateof(now()), 'def'); 

cqlsh:test> SELECT * FROM TestTable WHERE base = 467286c5-7d13-40c2-92d0-73434ee8970c; 

base         | ts        | value 
--------------------------------------+---------------------------------+------- 
467286c5-7d13-40c2-92d0-73434ee8970c | 2016-10-14 04:13:42.779000+0000 | def 
467286c5-7d13-40c2-92d0-73434ee8970c | 2016-10-14 04:12:50.551000+0000 | abc 

(2 rows) 

Обновление может быть сделано в любой из колонок, за исключением тех, которые используются в качестве ключей, отображаемые в отчете обновления ошибок было вызвано «IF» утверждение и потому, что он пытался обновить ts, который является частью составного ключа.

INSERT INTO TestTable (base, ts, value) 
     VALUES (ffb0bb8e-3d67-4203-8c53-046a21992e52, dateof(now()), 'bananas'); 

SELECT * FROM TestTable WHERE base = ffb0bb8e-3d67-4203-8c53-046a21992e52 AND ts < dateof(now()); 

base         | ts        | value 
--------------------------------------+---------------------------------+--------- 
ffb0bb8e-3d67-4203-8c53-046a21992e52 | 2016-10-14 04:17:26.421000+0000 | apples 

(1 rows) 

UPDATE TestTable SET value = 'apples' WHERE base = ffb0bb8e-3d67-4203-8c53-046a21992e52; 

SELECT * FROM TestTable WHERE base = ffb0bb8e-3d67-4203-8c53-046a21992e52 AND ts < dateof(now()); 

base         | ts        | value 
--------------------------------------+---------------------------------+--------- 
ffb0bb8e-3d67-4203-8c53-046a21992e52 | 2016-10-14 04:17:26.421000+0000 | bananas 

(1 rows) 
+0

так что на CQL нет способа добавить произвольные столбцы и использовать CAS? –

+0

Да, можно добавить динамические столбцы в строку, объяснение [здесь] (http: //www.datastax.com/dev/blog/does-cql-support-dynamic-columns-wide-rows) –

+0

Способ установки таблицы в настоящий момент, она добавляет динамические столбцы. –