2016-10-17 5 views
1

Я думаю использовать Cassandra для данных временных рядов в приложении Java. Мне также нужен средний (и min/max) за последние n минут.Cassandra: значение вставки и среднее значение update/min/max

Простой подход, чтобы сделать три звонка от клиента:

  1. вставить новое значение
  2. выбрать среднее, минимальный и максимальный за последние п минут
  3. обновления среднего

Есть ли более эффективный способ сделать это?

Первый и второй шаги используют один и тот же раздел и, таким образом, будут работать на одном узле. Таким образом, может быть сохранено обратное путешествие, если оба оператора могут быть выполнены в том же запросе. Но BATCH не поддерживает выбор (насколько я понимаю).

Третий запрос включает в себя другой раздел (и, вероятно, другой узел). Преимущество использования BATCH состояло бы в том, чтобы обе таблицы оставались в синхронизации. И я думаю, что это также спасло бы клиента -> координатора в оба конца. Но BATCH не поддерживает передачу результатов от выбора до обновления (насколько я знаю).

create table metrics (
    resource_name text, 
    metric_name text, 
    recorded_at timestamp, 
    value double, 
    primary key ((resource_name, metric_name), recorded_at) 
) with clustering order by (recorded_at desc); 

create table last_30m (
    metric_name text, 
    resource_name text, 
    avg_value double, 
    min_value double, 
    max_value double, 
    primary key (metric_name, resource_name) 
) with clustering order by (resource_name asc); 

ответ

2

Существует а avg, min и max агрегатные функции (как 2,2). Поэтому вам не нужна таблица для этого, вы можете просто запросить ее. Данные будут все быть последовательными на диске или в memtables так отсортирован по recorded_at

SELECT avg(value), min(value), max(value) FROM metrics WHERE resource_name = 'blarg' AND metric_name = 'cpu' AND recorded_at > {half hour ago}

В будущем будет now()-30m (CASSANDRA-11936), но сейчас вы должны вручную вычислить и поставить «половину час назад "значение в.

Я бы настоятельно рекомендовал избегать BATCH и обновлять вторую таблицу для этого и просто сделать запрос, чтобы прочитать значение, когда вам это нужно. Если вас беспокоит выполнение вышеуказанного запроса, проверьте его перед оптимизацией, которая, по всей вероятности, будет более дорогой. Если вам нужны такие вещи, как «средний за прошлый день», это может стоить того, но я бы не стал делать это как часть ваших обновлений, но больше «каждой минуты обновления» (также считал искровой поток)

+0

Спасибо за ответ. Сначала я проверю его, чтобы оценить производительность. – rwfbc

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