Какой лучший способ агрегировать и хранить данные в кластере Cassandra? Я имею в виду, что у вас есть таблица с данными о часах, агрегирование за день и сохранение в другой таблице. Этого можно легко достичь с помощью выбора и вставки для каждого ключа / периода, но есть ли лучший или другой способ? А как насчет материализованных представлений?
Упрощенная версия - СОЗДАТЬ ТАБЛИЧНЫЕ ТОЧКИ (id bigint, objid bigint, ts timestamp, avg double, last double, max double, min double, PRIMARY KEY ((id), objid, ts)) WITH compaction = {'compaction_window_size': ' 7 ',' compaction_window_unit ':' DAYS ',' class ':' org.apache.cassandra.db.compaction.TimeWindowCompactionStra tegy '} и gc_grace_seconds = 86400;
Использование материализованных представлений в кассандре довольно ограничено:
все первичные ключи из исходной таблицы должны появиться в представлении, возможно, в другом порядке.
агрегатные функции, такие как avg
, использовать нельзя
GROUP BY
не допускается
Поэтому я не думаю, что он подходит ни для вашего свертки на основе времени, ни для каких-либо других агрегатов.
Между прочим, материализованное представление было классифицировано задним числом. как экспериментальные и не рекомендуемые для нового производственного использования.
Это замечательно, если данные для агрегирования заморожены навсегда ... В противном случае будет сложно обеспечить согласованность.
Совершенно другой подход к свертке - использовать Элассандра для индексации временного столбца. Мы создадим вторичный индекс elasticsearch и будем синхронизировать его автоматически. Затем используйте встроенный API elasticsearch для запроса в разных временных масштабах, используя агрегирование гистограммы даты.
Таким образом, результат агрегирования не сохраняется, а вычисляется в реальном времени на основе эффективной вторичной структуры данных.
Используете ли вы достаточно новую версию для использования определяемых пользователем агрегатов (UDA / UDF)? Какая у вас модель данных