2017-01-27 4 views
0

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

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

ответ

1
create table test_counter(a text primary key, v counter); 

update test_counter set v = v + 1 where a = 'dummy'; 

select * from test_counter; 

dummy    | v 
-------------------+--- 
some_counter_name | 1 

принять во внимание, что помимо столбца первичного ключа вы можете иметь только счетчик столбцов в таблице, вы определяете с помощью счетчиков. Также вы всегда обновляете данные, ключ раздела просто обновляется.

Если вы хотите вернуть счетчик обратно в ноль, вы должны прочитать его текущее значение, а затем вы должны установить v = v - read_value. Обратите внимание, что могут быть дополнительные одновременные обновления.

Счётчики могут иногда обновляться, даже если клиент получил сообщение об ошибке обновления, поэтому они не на 100% надежны.

После получения комментариев :) похоже, что вы натыкаетесь на какую-то ошибку в названии Cassandra. Вот мое исследование вашей проблемы:

Я начал с исходной задачей:

Update "QueueMetric" 
    Set "TotalCompletedMessages" = TotalCompletedMesseages + 1 
    where "QueueName" = 'Test Queue one' 
    and "Time" = now(); 

Так что я создал простую таблицу:

create table QueueMetric(
    QueueName text primary key, 
    Time timeuuid, 
    TotalCompletedMessages counter 
) 

InvalidRequest: код = 2200 [Неверный запрос ] message = "Нельзя смешивать столбцы счетчиков и не счетчиков в одной и той же таблице"

Тогда я понял ваше заявление создать что-то вроде:

create table QueueMetric(
    QueueName text, 
    Time timeuuid, 
    TotalCompletedMessages counter, 
    primary key (QueueName, Time) 
) 

Update QueueMetric Set TotalCompletedMessages = TotalCompletedMesseages + 1 where QueueName='Test Queue one' and Time = now(); 

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

Ваш пример также не имеет смысла, потому что зачем вам кластеризовать счетчики по тайм-ауту?

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

Итак я пытаюсь определить столбец времени в виде строки:

create table QueueMetric(
    QueueName text, 
    Time text, 
    TotalCompletedMessages counter, 
    primary key (QueueName, Time) 
) 

Update QueueMetric Set TotalCompletedMessages = TotalCompletedMesseages + 1 where QueueName='Test Queue one' and Time = 'd14d44b2-e4d1-11e6-bf01-fe55135034f3'; 

Я тоже не удалось с этим ...

так что теперь моя идея состоит в том, что время как-то неправильное имя

create table QueueMetric(
    QueueName text, 
    Test text, 
    TotalCompletedMessages counter, 
    primary key (QueueName, Test) 
); 

Update QueueMetric Set TotalCompletedMessages = TotalCompletedMesseages + 1 where QueueName='Test Queue one' and Test = 'd14d44b2-e4d1-11e6-bf01-fe55135034f3'; 

Это также не работает ... давайте попробуем с помощью только ключа секционирования:

create table QueueMetric(
    QueueName text, 
    Time timeuuid, 
    TotalCompletedMessages counter, 
    primary key ((QueueName, Time)) 
); 

Update QueueMetric Set TotalCompletedMessages = TotalCompletedMesseages + 1 where QueueName='Test Queue one' and Time = now(); 

Теперь это действительно странно ...Я попробую с другим именем;

create table QueueMetric2(
    QueueName text, 
    Time timeuuid, 
    TotalCompletedMessages counter, 
    primary key ((QueueName, Time)) 
); 

Update QueueMetric2 Set TotalCompletedMessages = TotalCompletedMesseages + 1 where QueueName='Test Queue one' and Time = now(); 

нормально, это может быть время:

create table QueueMetric3(
    QueueName text, 
    SomethingOther text, 
    TotalCompletedMessages counter, 
    primary key ((QueueName, SomethingOther)) 
); 

Update QueueMetric3 Set TotalCompletedMessages = TotalCompletedMesseages + 1 where QueueName='Test Queue one' and SomethingOther = 'd14d44b2-e4d1-11e6-bf01-fe55135034f3'; 

Это просто выглядит как там должен быть первичный ключ и столбец?

create table QueueMetric4(
    QueueNamePlusTimeUUID text, 
    TotalCompletedMessages counter, 
    primary key (QueueNamePlusTimeUUID) 
); 

Update QueueMetric4 Set TotalCompletedMessages = TotalCompletedMesseages + 1 where QueueName='Test Queue one d14d44b2-e4d1-11e6-bf01-fe55135034f3'; 

сейчас я действительно растерялся, все в нижнем регистре?

create table queuemetric5(
    queuenameplustimeUUID text primary key, 
    totalcompletedmessages counter 
); 

update queuemetric5 set totalcompletedmessages = totalcompletedmessages + 1 where queuename='Test Queue one d14d44b2-e4d1-11e6-bf01-fe55135034f3'; 

Это также не работает :)

create table abc(
    a text primary key, 
    t counter 
); 

update abc set t = t + 1 where a='Test Queue one d14d44b2-e4d1-11e6-bf01-fe55135034f3'; 

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

create table hohoho(
    n text, 
    o timeuuid, 
    m counter, 
    primary key (n, o) 
); 

update hohoho set m = m + 1 where n='Test Queue one' and o = now(); 

Я думаю, мы должны подать это как какое-то ошибка ... он смотрит на меня вашу проблемы именования только :) Похоже, очередь что-то особенное в CQL

:)

+0

спасибо @Marko теперь я получаю ошибку синтаксиса ошибки только X = X + поддерживает любую идею, что это неправильно – AMH

+0

просто пришлите мне заявления, я попытайтесь понять это - мне кажется, вы пытаетесь указать значение x = что-то ... вы можете сделать только x = x + something –

+0

[email protected]: Datafyer> Обновить «QueueMetric» Установить «TotalCompletedMessages» = TotalCompletedMesseages +1 где «QueueName» = 'Test Queue one' и «Time» = now(); SyntaxException: Поддерживаются только выражения вида X = X + . – AMH