2016-12-23 4 views
0

я иметь следующую временную ряд в моей Кассандре кластере:предела Apache Cassandra и в clausel

CREATE TABLE consumptions (
    meter_id int, 
    date date, 
    meter_date_time timestamp, 
    data text, 
    PRIMARY KEY ((meter_id, date), meter_date_time) 
) WITH CLUSTERING ORDER BY (meter_date_time DESC) 

Для расчета потреблений из месяца я самый последний показания счетчика от месяца. В моем случае запрос выглядит следующим образом:

select * from consumtions 
where meter_id = 1 and 
date in (...'2016-12-30','2016-12-31'...) 
limit 1 

Я, зная, что в операторе с несколькими ключами разделов является анти-модель. Есть ли лучший способ для этого запроса без денормализации?

В большинстве моих других запросов я работаю с asnyc-запросами, но это вернет каждый результат, и я не могу использовать Limit.

+0

Спасибо за ваши комментарии. Я применил второе решение: ** Второй альтернативой является запуск запросов async по одному для каждого дня в месяц и фильтрация последней меры на уровне приложения. Это всего лишь немного кода. ** – itstata

ответ

3

Предложение IN обычно плохое, но поскольку вы вкладываете в него максимум 31 день, ИМХО, вы можете сохранить его, не беспокоясь о выступлениях.

Вторая альтернатива - запускать запросы асинхронного запроса один на каждый день в месяц и отфильтровывать самую последнюю меру на уровне приложения. Это всего лишь код.

Третья альтернатива, если у вас есть много датчиков, заключается в том, чтобы запрашивать по дате месяца по заказу потомков, чтобы найти последнюю меру в ближайшее время. Таким образом, вы будете запускать меньшее количество запросов, удаляя некоторую нагрузку из кластера за счет некоторой задержки на уровне приложения, потому что, если ваша последняя мера находится на 29-м месяце, вы запрашиваете 31-й и не находите никаких результатов, вернуться в один прекрасный день и запросить 30-е место и не найти результата, вернуться в один прекрасный день и запросить 29-й и найти результат.

+0

В статье всегда плохо. Лучше запускать асинхронные запросы параллельно, вместо использования предложения IN, потому что вы ставите ударение на координатора, вместо того, чтобы обрабатывать его на клиенте. Вы можете решить это, сохранив ведра времени в одной таблице, а затем вы всегда знаете, где ваши последние данные. –

+0

Я не согласен. Если вы забиваете свой кластер, это явно плохо. Если вы запускаете этот запрос один раз каждые X дней, это ничего не сломает. Кроме того, ОП задал вопрос о том, как это сделать, не денормализуя данные, поэтому ваше предложение не может быть удовлетворительным. – xmas79