Cassandra, счетчики и удаление по полю

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

CREATE TABLE IF NOT EXISTS metrics(
  timestamp timestamp,
  value counter,
  PRIMARY KEY ((timestamp))
);

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

DELETE FROM metrics WHERE timestamp < '2015-01-22 17:43:55-0800';

Но эта команда возвращает следующую ошибку:

code=2200 [Invalid query] message="Invalid operator < for PRIMARY KEY part timestamp"

Как я могу реализовать этот функционал?


person Mark    schedule 23.01.2015    source источник


Ответы (1)


Чтобы удаление работало, вам нужно указать точный ключ с оператором равенства. Удаление с помощью оператора больше/меньше не работает. По сути, вам нужно будет получить список временных меток, которые вы хотите удалить, и выполнить итерацию по ним с помощью скрипта (Python?) или короткой (Java/C#) программы.

Одним из возможных решений (если вы знаете, как долго вы хотите хранить данные) было бы установить время жизни (TTL) для данных. В таблице со столбцами-счетчиками вы не можете сделать это как часть команды UPDATE. Единственный вариант - установить его при создании таблицы:

CREATE TABLE IF NOT EXISTS metrics(
  timestamp timestamp,
  value counter,
  PRIMARY KEY ((timestamp))
) WITH default_time_to_live=259200;

Это удалит все данные, помещенные в таблицу, через 3 дня (259200 секунд).

ИЗМЕНИТЬ

И оказывается, что возможное решение на самом деле невозможно. Несмотря на то, что Cassandra позволяет вам создать таблицу счетчиков с набором default_time_to_live, она не навязывает это.

Вернемся к моему исходному абзацу. Единственный способ выполнить DELETE — указать конкретный ключ, который вы удаляете. А для встречных столов, похоже, это единственный возможный путь.

person Aaron    schedule 23.01.2015
comment
это может сработать, но сейчас я застрял в этой проблеме: stackoverflow.com/questions/28120834/ - person Mark; 24.01.2015