2016-12-30 4 views
1

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

CREATE TABLE propatterns_test.test (
clientId text, 
meterId text, 
meterreading text, 
date timestamp, 
PRIMARY KEY (meterId, date)); 

Мой удаления запроса:

DELETE FROM test WHERE meterid = 'M5' AND date > '2016-12-27 10:00:00+0000'; 

который возвратил эту ошибку:

InvalidRequest: Error from server: code=2200 [Invalid query] 
    message="Invalid operator < for PRIMARY KEY part date" 

После этого я попытался удалить определенную строку:

DELETE FROM test WHERE meterid = 'M5' AND date = '2016-12-27 09:42:30+0000'; 

На самом деле таблица содержит те же запись, но она не была удалена.

Это то, что выглядит мои данные, как:

meterid | date      | clientid | meterreading 
---------+--------------------------+----------+-------------- 
     M5 | 2016-12-27 09:42:30+0000 |  RDS |  35417.8 
     M5 | 2016-12-27 09:42:44+0000 |  RDS |  35417.8 
     M5 | 2016-12-27 09:47:20+0000 |  RDS |  35417.8 
     M5 | 2016-12-27 09:47:33+0000 |  RDS |  35417.8 

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

ответ

1

Удалить с помощью предложения диапазона возможно в C * 3.0 и далее. Глядя на полученную вами ошибку, я думаю, что вы находитесь в версии до 3.0, и в этом случае вы не сможете это сделать через CQL.

1

Я вижу здесь пару вещей. Прежде всего, как упоминалось в iconnj, удаленные диапазоны невозможны в версиях до Cassandra 3.0.

Во-вторых, попытка удаления одной строки не срабатывает (я считаю) из-за того, что вы не учитываете миллисекунды, присутствующие на отметке времени. Вы можете увидеть это, если вы гнездо вашего date столбца внутри функций timestsampasblob и blobasbigint:

[email protected]:stackoverflow> SELECT meterid,date,blobAsBigint(timestampAsBlob(date)) 
    FROM propatterns WHERE meterid='M5'; 

meterid | date      | system.blobasbigint(system.timestampasblob(date)) 
---------+--------------------------+--------------------------------------------------- 
     M5 | 2016-12-27 09:42:30+0000 |          1482831750000 
     M5 | 2016-12-30 17:31:53+0000 |          1483119113231 
     M5 | 2016-12-30 17:32:08+0000 |          1483119128812 

(3 rows) 

Обратите внимание на нулях на конце 2016-12-27 09:42:30+0000 строки, что я явно вставленный из вашего примера. Обратите внимание, что две строки I INSERTed с использованием вложенных функций dateof(now()) фактически имеют миллисекунды в качестве последних трех цифр на отметках времени.

Смотрите, что происходит, когда я беру эти три цифры, и добавить их в миллисекундах, когда я удалить одну из строк:

[email protected]:stackoverflow> DELETE FROM propatterns WHERE meterid='M5' 
    AND date='2016-12-30 17:32:08.812+0000'; 
[email protected]:stackoverflow> SELECT meterid,date,blobAsBigint(timestampAsBlob(date)) 
    FROM propatterns WHERE meterid='M5'; 

meterid | date      | system.blobasbigint(system.timestampasblob(date)) 
---------+--------------------------+--------------------------------------------------- 
     M5 | 2016-12-27 09:42:30+0000 |          1482831750000 
     M5 | 2016-12-30 17:31:53+0000 |          1483119113231 

(2 rows) 

В итоге:

  • Вы не можете выполнить ряд удаляет до к Кассандре 3.0.
  • Вы не можете удалить отдельные строки, привязанные по меткам времени, без указания миллисекунд, если действительно присутствуют миллисекунды.

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

  • Нет связанных вопросов^_^